Skip to main content

Full text of "Todospectrum Magazine (Spain)"

See other formats





Rotación 

deLIDGs 


Interface 

RS-232-C 


+- 

í M 
* * 













^curso de INFORMATICA 

• LENGUAJES BASIC Y COBOL 

• HORARIO OPCIONAL 

• MANANA, TARDE Y NOCHE 

• CURSO DE 12 MESES 

• GRUPOS REDUCIDOS 

• UN ORDENADOR POR ALUMNO 

• ENSEÑANZA INDIVIDUALIZADA 

• PRACTICAS PARA EMPRESAS 

NOVEDAD: ENSEÑANZA DUSGSDA POS ORDENADOS 


INFORMATE EN: 


Enrique Granados, 48, entio. dctia - Tel. 258 66 44 

BARCELONA 

Espoí y Mina, 6 pral. Tel. 23 16 02-03 

ZARAGOZA 

Niebla. 15. 1.\ iíqda. - Tel. 27 89 71 
SEVILLA 

Gran Vía. 51. entio. ízqda. - Tel. 25 48 11-12 

LOGROÑO 





SUMARIO 

AÑO II - N.° 25 - OCTUBRE 1986 


Aunque el Spectrum carece de 
comandos que faciliten el 
rellenado de figuras, es fácil suplir 
esta deficiencia e incluso ir un 
paso más allá y realizar filis con 
entramados. 


El mes pasado vimos cómo se 
pueden invertir los gráficos 
definidos por el usuario. En este 
artículo estudiaremos un 
problema algo más complejo: la 
rotación de UDGs. 


Enseñamos a tu ordenador a jugar 
a las tres en raya, utilizando las 
mismas técnicas que se aplican en 
la programación de juegos de 
inteligencia como el ajedrez o las 
damas. 


GUIA DEL HACKER: 
PENTAGRAM 


Descubrimos los pokes más 
interesantes del último juego de 
Ultímate y le añadimos una rutina 
de control direccionai similar a la 
de los anteriores programas de 
esta firma. 


INTERFACE 
RS-232-C (II) 


Segundo y último de los artículos 
dedicados al montaje de un 
inlerface RS-232-C, con la 
descripción del software de 
control, la lista de componentes y 
los esquemas del circuito. 


COMPRESOR 
DE TEXTOS 


El equivalente para textos de los 
conocidos programas de 
compresión de pantallas es esta 
rutina que permite almacenar casi 
cincuenta mil caracteres en 35K 
de memoria. 


FILL 

ILUSTRADO 


TRES 
EN RAYA 


ROTACION 
DE UDGs 


























SERVICIO DE EJEMPLARES ATRASADOS 



Para hacer su pedido, rellene este cupón HOY MISMO 
y envíelo a: 

TftillIfiniÉ'Mni Bravo Morillo, 377 

mospeciran ™. 733 96 62 - 28020 maorid 


Ruego me envíen los siguientes ejemplares atracados de TQD03- 


PECTRUM .al precio de 300 pts. 

El importe lo abonaré 

□ POR CHEGUE □ CONTRA REEMBOLSO O CON MI TARJETA DE 
CREDITO □ AMERICAN EXPRESS □ VISA O INTERBANK 

Numero de mi tarjeta: ] | ] ‘ I . , í L I i I J ■ . [ J 1 i . i ^ . 

Fecha de caducidad., , , , .. Firma 

nombre ..... 

DIRECCION . 

CIUDAD . . CP ... 

PROVINCIA . . . , .. ... 


Complete su colección de 

üMtospectrun 

A continuación le resumimos el contenido de los ejemplares 
aparecidos hasta ahora. 


Núm, 2 - 300 ptas. 

Gráficos profesionales/Desplaza- 
miento pixel a pixel/Utílización de ru- 
tinas/Construcción. del ¡nterface 
centronics/Programas de utilidad 
para microdrive/Rutina reset en códi¬ 
go máquina/Análisis del editor de 
textos Tasword/lnterfaces para im¬ 
presoras/Proigra mas. 

Núm, 3 - 300 ptas. 

Novedades sonimag'84/Ampliando 
el Basic/Programas para ordenar 
programas/Gráflcos con el VU-3D/ 
Lenguaje Forth/Archivos en micro- 
drive/Programación de un interface 
de irnpresora/Programas, 

Num. 4 - 300 ptas. 

De profesión: programador/Consola 
para el Spectrum/Comparación có¬ 
digo máquina-Basic/Análisis progra¬ 
ma contabliidad/Caíendario/Pascal/ 
Programas, 

Num. 5 - 300 ptas, 

Roppys para Spectrum/Diseño asis¬ 
tido por ordenadür/64 Caracteres 
por línea/Juego de la vida/Pascal/Asi 
hacemos las portadas/Controí de 
e valuaciones/Prog ramas, 

Núm, 6 - 300 ptas. 

Representación de funciones/Todús 
los caminos conducen a la RGM/Jue- 
gas/Pascal/Construcción de un lápiz 
Óptico/Programas de gestión, El SITI/ 
Logo: torgugas para todos/ interrup¬ 
ciones del Z-80/Programas 

Núm. 7 - 300 ptas. 

Del 48 al PLUS paso a paso/¿Plotter 
para Spectrum?/Juegos/Libros de 
código máquina/Lápiz óptico. Pro¬ 
gramación det montaje/EI LOGO en 
la escuela/Pascal/Floppys para 
Spectrum/Prog ramas. 

Num 8 - 300 ptas. 

Amplia tu memoria... a 48 K/Arquitec- 
tura: análisis dei PREYME/Juegos/ 
FORTH. Nociones básicas/Una clave, 
please/QL Magazine. Ultimas nove¬ 
dades, análisis de software, Lengua¬ 
jes/Aula informática con Spectrum/ 
Programas, 

Núm 9 - 300 ptas. 

Spectrum parlanchin/Juegos/Aula 
informática con Spectrum/Análisis: 
Comercial 4/Pascal/Periféncos: Wa- 
fadrive/QL Magazine: EASEL io mejor 
de PSlON, Música con QL/Despfaza- 
miento Pixel a Pixel. aportación de 
lectores/Programas/Programer H. 

Núm, 10 - 300 ptas. 

Discos: invesdisc 200/Juegos/Dos 
programas simultáneos/Protección 
del software/Conozca extremadura, 
consulte a su ordenador/Desensam- 
blador Z-80/Sofware educativo/QL 
Magazine: novedades informal. Hoja 
de cálculo. Ajedrez/Construya su 
propio Joystick/Pascai/prcgramas. 


DISPONEMOS 
DE TAPAS ESPECIALES 
PARA SUS EJEMPLARES DE ZX 

[sin necesidad de encuademación) 


Núm. 11 - 300 ptas. 

Actualidad/La otra cara del LOGO/ 
Juegos/El Spectrum habla castella- 
no/SOFTAID ayuda para Etiopia/ 
S O S, aquí el Spectrum/Dibujar con 
lápiz óptico/QL Magazine: Procesa¬ 
dor de textos, Teclas de función pro- 
gramabies/Programas. 

Núm. 12 - 300 ptas. 

Actúalidad/lnteligencia artificial/Lá- 
piz óptico dk'TRONiCS/Juegos/Aná- 
lisis/Bingo/Z-80 PiO/Código máqui- 
na/Análisis: MASTERFILE/Progra- 

mas. 

Núm. 13 - 300 ptas, 

ActuaÜdad/Discos: Discovery 1/Jue- 
gos/lnteiigencia artificial/ün nuevo 
sistema operativo/GL Magazine: Ar¬ 
chive, Cartridge doctor. Aplicaciones 
comerciales/Código máquina/Pro- 
gramas 

Núm. 14 - 300 ptas. 

Actualidad, Spectrum 128/Cálculo 
de estructuras para ingenieros y ar- 
quitectos/HELP utilidades en micro- 
drive/Juegos/EI microdrive ese des- 
conocido/Código máquina/QL Ma¬ 
gazine: GRAPHIC QL Juegos Discos 
de 720 K/Un nuevo operativo/Progra- 
mas, 

Núm. 15 - 300 ptas, 

Actualidad/Spectrum 128/Un nuevo 
operativo/Círculos redondos/Jue- 
gos/Utilídades: BETA-BASIC/OL Ma¬ 
gazine: Introducción al SUPER BA¬ 
SIC. Nuevas utilidades/Hardware: 
Puertas lógicas/Código máquina/ 
Programas. 

Num. 16 - 300 ptas, 

Actualidad/Cinco horas con 
SCREEN$/Hardware práctico/Cái- 
culos de infinita precisión/Juegos/ 
Un nuevo operativo/QL Magazine: 
Gráficos en 5UPER-BA5IC. Dibujan¬ 
do con ratón. Archivos con Archive. 
Programa/La ultima batalla. Juego 
estratégico, 

Núm. 17 - 300 ptas. 

Actualidad/Gráficos interactivos/ 
Juegos/Código máquina/Un nuevo 
operativo/Trucos de programación/ 
QL Magazine: Radiografía del QL 
Gráficos en SUPER-BASlG/Ubros/ 
Programmas 

Núm. 18 * 300 ptas. 

Actualidad/lntroduccíón al C/Libros/ 
Juegos/De cinta a microcinta/VIsión 
panorámica de los microprocesado¬ 
res más comunes/QL Magazine: Co- 
py de grises Microprocesadores 
68000. una familia numerosa/Curio- 
seando en ia ROM/Programas. 


















EDITORIAL 


DIRECTOR: 

Enrique F. Larreta 

REDACTOR JEFE: 

Emiliano Juárez 

REDACCION: 

Ignacio Borrell, Octavio López. 
Antonio del Rio 

DISEÑO: 

Ricardo Segura y Benito Gil 


Editado por PUBLINFORMATICA, S. A. 
Bravo Morillo, 377, 5.0 A. TeL: 

733 74 13-28020 Madrid 

Presidente: 

Fernando Bolín 

Director Editorial Revistas de Usuarios; 

Juan Arencibia 
Director de Ventas: 

Antonio González 
Producción: Miguel Gnieva 
Servicio al cliente: 

Julia González. TeL: 733 79 69 
Administración: 
PUBLINFORMATICA, S. A. 
Publicidad Madrid: 

Emilio García 
Dirección, Publicidad y 
Administración: 

Bravo Muril'lo, 377.5 o A. TeL 733 74 13. 
Telex: 48877 OPZX e 28020 Madrid 
Publicidad Barcelona; 

Lidia Cendres. Pelayo, 12. Tels. (93) 
318 02 89 - 301 47 00, ext 27 y 28, 
08001 Barcelona 
Depósito legal: M-29041 -1984 
Distribuye S.G.E.L, Avda. Vaídelaparra, 
s/n. Alcobendas (Madrid). 
Fotomecánica: Karmat, C/ Pantoja, 10. 
Madrid. 

Fotocomposición: Espacio y Punto 
Imprime: Héroes, C/ Torrelara, 8. Madrid. 
Distribuidor en VENEZUELA, 

SIPAM, S, A. 

AVD. REPUBLICA DOMINICANA, BDIF, 
FELTREC - OFICINA 4B BOLEITA SUR 
CARACAS (VENEZUELA) 

Esta publicación es miembro de la 
Asociación de Revistas de 
Información an asociada a la 
Federación Internacional de Prensa 
Periódica, FIPP. 


SUSCRIPCIONES: 

Rogamos dirijan toda la correspondencia 
relacionada con suscripciones a: 
TODOSPECTRUM EDISA: Tel. 415 97 12 
G/ López do Hoyos, 141 -50 
28002 MADRID 

(Para todos los pagos reseñar solamentes 
TODOSPECTRUM) 

Para la compra de ejemplares atrasados 

diríjanse a la propia editorial 

TODOSPECTRUM 

C/ Bravo Murillo. 377. 5° A 

Tel. 733 74 13 - 28020 MADRID 


Si deseas colaborar en TODOSPECTRU M 
remite tus artículos o programas a Bravo 
Murillo,377, 5.c A. 28020 Madrid Los 
programas deberán estar grabados en 
cassette y los artículos mecanografiados. 

A efectos de remuneración, se analiza cada 
colaboración aisladamente, estudiando su 
complejidad y calidad. 


EL NUEVO 
SPECTRUM 


Como estaba previsto, la Personal Computer World Show 
fue el escenario en que Amstrad presentó el nuevo Spectrum 
128K +2, En contra de los rumores que se dejaron oír hace 
unos meses, no se trata de una máquina revolucionaria, sino 
más bien de un Spectrum 128 con algunas mejoras y un 
aspecto diferente. La misma capacidad de memoria, gráficos y 
sonido, pero por fin un teclado verdaderamente profesional y 
un cassette incorporado que le confiere un innegable parecido 
al Amstrad 464. También posee dos ports de joystick, que, por 
desgracia, sólo podrán utilizarse con los nuevos joysticks Sin¬ 
clair, Y como ya viene siendo habitual, Amstrad ha vuelto a 
rizar el rizo ofreciéndolo a un precio inferior al del propio 
Spectrum 128. 

Precisamente la tendencia generalizada a la bajada de pre¬ 
cios es la noticia más destacable últimamente en el campo de 
la microinformática. No hace mucho tiempo (apenas unos 
meses), comprar un IBM PC o cualquiera de las máquinas 
compatibles nos hubiera costado más de trescientas mil pese¬ 
tas. Ahora, por menos de la mitad, es posible adquirir un com¬ 
patible más rápido, con más memoria y con mejor resolución 
gráfica que el ordenador de IBM, el Amstrad PC 1512, autén¬ 
tico centro de atención de la Personal Computer World Show. 
Y además de Amstrad, Investrónica y Spectravídeo también 
están ofreciendo compatibles PC a precios de ordenador 
doméstico, poniendo al alcance de los particulares equipos de 
elevadas prestaciones que hasta hace poco estaban restringi¬ 
dos al ámbito empresarial. 


TODOSPECTRUM 












PENTAGRAM es la última creación de ULTIMATE, y tiene 
un enorme parecido con los famosos Knight Lore y Alien 8. 
Sin embargo, aporta algunas características interesantes que 
lo hacen destacar sobre éstos. 


L o primero que intento hacer a 
ía hora de enfrentarme con un 
juego para descubrir sus secre¬ 
tos, es conocer lo más posible acerca 


de él, su argumento, el objetivo, la 
forma de jugar, etc. Hay veces que 
esto resulta bastante difícil, pues las 
instrucciones pueden resultar enig¬ 


máticas (los señores de ULTIMA¬ 
TE son especialistas en esto). Sin 
embargo, consultando diversas 
fuentes, conseguí enterarme de qué 



















































era lo que había que hacer. El objeti¬ 
vo del juego es encontrar el Penta¬ 
grama. Para ello, ayudados de unos 
cubos llenos de agua mágica y que 
podremos conseguir disparando a 
los pozos que hay en algunas panta¬ 
llas, deberemos arreglar cuatro es¬ 
pecies de «obeliscos» que se encuen¬ 
tran en otras tantas pantallas. Una 
vez hecho esto, aparecerá en una 
habitación, hasta entonces vacía, el 
Pentagrama, que no es otra cosa que 
una estrella de cinco puntas inscrita 
en un círculo. Ya sólo nos queda co¬ 
locar en cada una de las puntas una 
de las cinco piedras con extrañas 
marcas que se erfcu entran reparti¬ 
das aleatoriamente por tas 139 pan¬ 
tallas que tiene el juego. 

Tras enterarme es esto, cargué el 


programa para hacerme una prime¬ 
ra idea acerca de la protección y ju¬ 
gar unas cuantas partidas. Esto últi¬ 
mo es importante, pues debemos sa¬ 
ber exactamente cómo se comporta 
nuestro personaje en determina¬ 
das situaciones, ya que esto nos ayu¬ 
dará a imaginarnos un poco cómo 
serán las rutinas que lo controlan, lo 
que nos facilitará su identificación si 
damos con ellas. 

Instalación en el 
microdrive 

La protección no parece compleja 
en absoluto. Lo primero que carga 
son dos programas BASIC. El pri¬ 
mero dibuja el logotipo de Erbe (la 
distribuidora del programa para Es¬ 
paña) y carga el segundo. Aparente¬ 


mente no tiene ninguna otra fun¬ 
ción. Probé a saltármelo y cargar di¬ 
rectamente el segundo programa 
BASIC. Al finalizar la carga pude 
comprobar que el juego funcionaba 
perfectamente. Ahora sólo tenía 
que estudiar el segundo programa 
BASIC. A primera vista sólo tiene 
una línea, con número cero, que 
contiene dos pokes típicos de tas 
protecciones: POKE 23613, 0 y PO- 
KE 23659,0. Sin embargo, estos pokes 
no son lo que parecen ser, sino que 
en realidad son otras direcciones y 
oíros números los que se pokean, 
estando cambiados los códigos AS¬ 
CII de estos para despistar. La ver¬ 
dadera función de estos pokes, una 
vez se ha descubierto cuáles son, es 
la de hacer aparecer el resto del pro- 




























































































































































































































































































































































































































1 DATA "DD21E0F911ÍC023ÉFF37C 
D560530F1DD21004011001B3EFF37CDF 
BFADD21A06DI19E7A3ÉFF37CD56122E" 

2 DATA "Ú5D2000OF£3EC3329EC42 
15SS32S9FC42ÍOO3C220BCC22ÍCCC21B 
03B22EACA22DCD621F2EA11F5921157" 

3 DATA "014E01EDB021A06D1Í005 
E019E7AEDfe021FF3D22B2SC3Éi3E2BF92 
B2B223D5C2A535C224B5C3680230E11 11 

4 DA fA ' J 22S9SC360D23368023226 
15C22635C22655CFBAFCD0116C39512C 
D52B9CB4FC2 1 BB4CB572Ü68CB5F“ÚFD8 11 

5 DATA "C2Ü904CB&7C2OES43EBFC 
D52B9E6ul2a¿6F3AF324EC43EC932e7B 
006962 19 i 847SBE20Q323-10F9E512 AB " 

6 DATA "3D3207C4C52121A734CDC 
5A F063CC5CDDA A F C13E7FCD52B9E6072 
81CCB472Ü1EE60220 1631005E2i 1Ü5F Jl 

7 DATA ‘■2iA7343EBÍ)3297&03E073 
24aC4C3C5ñFI0D4CIEU0BA3EDD32B7B 
03E07324BC431005EF3C393AFFD131S" 

B DAIA "C&01AEFDCBO16E2SFA3AO 

05CFE3O3816 F E 3A3012$6305F B7935F1 
60021045B195E2356237E123E7EOE 2A 11 

9 DATA CD52B9C301B5219D84100 
321 A094 1104BFÜ10300E DBO1 BBFDDESD 
D2 i004011001B3EFFCDC204DDE110F9" 

10 DATA "18AD2B02CBE13E04CB412 
801AFCB4928023E01CB5)2B023E02CB5 
9 2 80 2 3E0 3FE O 4291C5F D DE .5 D D 2 10 U B9 111 

11 DAIA II 6FA7CDBDC5DDE11600219 
ia41?l9l9195Fl979E6F0B64F3Ee0CD5 
2B92S02CBD93EF7CD52B9E6082B1353" 

12 DATA M 02CBD9C30GBF04(.H01020 
104u201 Ú2Ú1040101020 1047A7574737 
26A69 5ü 5 $50 45FFC32 DB 42B02CBO B1 D M 

sfo¡> PAPER' Os BGRDER O: INF 7: C 
LtAft 28063: RLB'I'ÜRE : LET a*lüs 
LET b=l 1: LEÍ 1 c=12: LEI ü = 13-. LE 
I e=i4¿ LEÍ t“15s LET ad=6e4 

210 PftINI AT O,Os“LEYENDO LINEA 
:"¡ FOR = 1 TU 12: PRJNT AT 0,16 

220 REAL) a*: LET ILEN aí-3 

TO > : LET í TÜ LEN aí-4) : 

IF LEN af/2::. :■ INT (LEN aí/,É> THEN 

PRINT FLASH IsAT O, Oí '‘LINEA I 
MPAR EN 11 i STÜF 1 

230 LET w=0: POR “ I TÜ LEN a* 
STEP i:: Lt'f v=‘VAL a* <;< ) #16+YAL a 
X C 5-! + i ) ; LET w-v*+v 

240 POKE ad T vi LET ad“ad+li NEX 

F ::: 

250 LEI v=Os FQR x^l TÜ 4: LET 
v=v* Í6+0AL bfí Ki: NEXT x : IF v< 
w THEN PfUNT FLASH 1 ; AT 0,0* 11 E 
RRQR EN LINEA STOP 

260 NEXT z 

270 OLEAR : LNPUT "QUIERES GRAB 
Ah'LÜ EN CINTA ■ LIME AXf IF Ai 
QR AX="S“ THEN SAVE "GARBA 
LENTA" LLNE 200 

290 FQft X =*23300 TO 23327 STEP 3 
: READ A, RANDÜMl ¿E A'. ROLE X, 
FEEK 23670: PÜH.E X+l.PEEK 23671: 

F'ükE K+2 h Bs NEXT X 

290 PRÍNI■ PÜN EN MARCHA LA ÜIN 
TA ORI61NAL"! RANDÜMI2E USR 6E4 

300 DATA 49493,1 50 ,A, L20,A t 72,A 
t El5 , A , 87 , A , 89 , A f 6 , A , 17 » 49534, 60 , 
A,4 


grama. En las líneas que aparecen, 
lo primero que encontramos son de 
nuevo los mismos pokes, pero esta 
vez de verdad. Tras esto hay una lla¬ 
mada a una rutina en código máqui¬ 
na cuya dirección también es distin¬ 
ta de la que aparece en el listado. Lo 
que viene después es sólo para des¬ 
pistar y no tiene ninguna utilidad. 
La rutina en código máquina hace 
un Idir de un bloque de 206 bytes a 
la parte alta de la memoria. En estos 
se encuentra una rutina de LOAD 
de alta velocidad, aunque bastante 
semejante a la de la ROM. Con esta 
rutina se carga la pantalla de presen¬ 
tación y el buffer de la impresora, 
para después ejecutar lo que se ha 
cargado en el bufTer. Aquí se carga 
el bloque principal a velocidad nor¬ 
mal. Ya tengo todos los datos que 
necesito saber: el bloque principal 
se carga a partir de la dirección 
24064 y tiene 31390 bytes de longi¬ 
tud. Para asegurarme de que no es 
necesaria la presencia del programa 
BASIC en la memoria para que el 
juego funcione correctamente, 
pruebo a crear una cabecera falsa y 
cargar solamente el bloque princi¬ 
pal con LOAD CODE. Al termi¬ 
nar la carga lo ejecuto con RANDO- 
MIZE USR 24064 y compruebo que 
funciona perfectamente. Ahora me 
dispongo a pasarlo a microdríve. En 
realidad, no es que sea necesario pa¬ 
sar un programa a microdrive para 
estudiarlo, pero resulta verdadera¬ 
mente tedioso tener que cargar el 
programa desde la cinta cada vez 
que probamos un poke y deseamos 
continuar la investigación. 

Para pasar e! programa a micro¬ 
drive el único problema que tengo 
es que comienza en una dirección 
muy baja, pero esto es fácilmente 
superable, pues queda espacio de 
sobra por arriba, así que lo que hago 
es cargarlo en una dirección más al¬ 
ta y transportarlo a su verdadera di¬ 
rección con un LDIR una vez finali¬ 
zada la carga. Además, también ten¬ 
go sitio de sobra para ubicar el 
MONS, cosa que hago en la direc¬ 


ción 57000. Sin embargo no es posi¬ 
ble volver al monitor desde el juego, 
ya que éste utiliza la memoria don¬ 
de se encuentra el desensamblador 
para la construcción de gráficos y al¬ 
gunas otras cosas. 

Los primeros pokes 

Al empezar a desensamblar me 
da la impresión de que estoy desen¬ 
samblando el Knight Lore. Es como 
st hubieran cogido el lisiado fuente 
de éste y hubieran hecho los cam¬ 
bios necesarios hasta conseguir el 
listado del Pentagram. En la direc¬ 
ción 24064 hay simplemente una 
instrucción DI y un salto a la direc¬ 
ción 44935 tras haber puesto la pila 
en 24064. En la dirección 44935 em¬ 
pieza el programa principal. 

Casi al principio, en 44967, hay un 
LD A,5 seguido por un LD 
(42785),A. No puedo resistirme a 
probar a cambiarlo antes de conti¬ 
nuar. Como cabía esperar, es el nú¬ 
mero de vidas. Con esto ya podemos 
elegir el número de vidas con que 
queremos jugar. Ahora, sabiendo 
que las vidas se almacenan en 
42785, resulta fácil encontrar un po¬ 
ke para vidas infinitas, con sólo bus¬ 
car dónde es decrementado su va¬ 
lor. Me encuentro que se hace den¬ 
tro de una subrutina que comienza 
en 49900, y que es llamada un poco 
después del punto donde se inicia- 
lizan las vidas. Esto me da pie para 
pensar que desde la dirección 44997 
en adelante se encuentra el bucle de 
juego, y todo lo que hay antes se en¬ 
carga de la presentación y las opcio¬ 
nes. 

El poke para la inmunidad fue 
más costoso de encontrar, y no lo 
conseguí hasta bastante después. 
Encontré un lugar donde se testea- 
ban los valores de (IX+0) y (IX+1), y 
si ambos eran cero se saltaba a 
44997, donde yo ya sabía que se de- 
crementaban las vidas. Probé a eli¬ 
minar el salto. El resultado no fue el 
esperado. Todo empezó con norma¬ 
lidad. Me acerqué a unos pinchos y 
fui destruido. Parecía que el poke no 



















tenía ningún efecto. Sin embargo, 
enseguida me di cuenta de que sí lo 
tenía. Cuando el personaje «explo¬ 
tó», el programa pareció no enterar¬ 
se de ello. El resto de los seres que 
había pululando por la pantalla con¬ 
tinuaron haciéndolo normalmente. 
Todo parecía normal, salvo que el 
protagonista ya no estaba y no vol¬ 
vía a aparecer. La causa es que el 
punto modificado no se encarga de 
comprobar si colisionamos con al¬ 
go, sino de comprobar si ya hemos 
terminado de explotar. En cualquier 
caso todas estas investigaciones me 
servirían después para ir enterándo¬ 
me de qué era lo que debía hacer si 
quería visualizar una determinada 
pantalla y que se moviera todo lo 
que había en ella. Pude averiguar 
que el bucle principal de juego 
siempre que no se saliera de panta¬ 
lla o nos mataran, se cerraba sobre 
45018, porque ésta era la dirección a 
la que se saltaba cuando la compro¬ 
bación anteriormente citada era ne¬ 
gativa. Después pude encerrar den¬ 
tro de este bucle otro más pequeño 
que se repetía para cada uno de los 
objetos existentes en la pantalla, ya 
sean piedras, fantasmas, disparos o 
el propio personaje. Cada objeto 
ocupa 32 bytes, aunque nuestro per¬ 
sonaje ocupa el doble porque es tra¬ 
tado como dos objetos separados, 
uno de cintura para arriba y otro de 
cintura para abajo. Esta técnica ya 
era usada en el Knight Lore, y ser¬ 
vía, por ejemplo, para utilizar las 
mismas piernas en distintos perso¬ 
najes (el Sabreman, el soldado, 
etc.), con el consiguiente ahorro de 
memoria en los gráficos. 

Ahora tenia más reducida la bús¬ 
queda, porque sabia que la compro¬ 
bación de colisión con los objetos 
había de estar dentro de este bucle 
pequeño. Lo que me despistó fue 
que la comprobación se efectuaba 
dentro de una subrutina a la que no 
se llamaba con un cali. Dentro de el 
bucle pequeño, en el que cada vez 
se va actualizando el registro IX pa¬ 
ra apuntar a los datos del objeto co- 


Objeto invisible 99 

Pozo 120 

Bloque movible 121 

Runo 1 144 

Runo 2 145 

Runo 3 146 

Runo 4 147 

Runo 5 148 

Disparo normal 150 

Bicho con tentáculos 160 

Bola amorfa 164 

Zombie 168 


Tabla 3. 

Pokes predefinidos 

0 Disparo normal 

1 Dispara pozo 

2 Dispara tronco movible 

3 Dispara piedra sube-baja 

4 Dispara piedra móvil 1 

5 Dispara piedra móvil 2 

6 Dispara árbol 

7 Dispara araña 

8 dispara alto 

9 Dispara bajo 


Tabla 1. POKES 

Número de vidas POKE 44968,0 
Vidas infinitas POKE 49917.175 
No imprime vidas POKE 49310,201 
Disparo sin soltar tecla 

POKE 49465,0 
Disparo automático 

POKE 49454,24 
POKE 49465,0 
Inmunidad POKE 50247,24 
Altura del disparo 

POKE 49534,n 

Duración sonido durante juego 
POKE 49183,n 

Pantallas donde se quiere empezar 
POKE 49896,n 
POKE 49897,n 
POKE 49898,n 
POKE 49899,n 
Muerte instantánea 

POKE 50248,0 


Tabla 2. Pokes de disparo 
(todos los pokes en 49493) 


Nada ] 

Abol 6 

Araña 17 

Pincho movible 28 

Cepo 30 

Cepo manso 31 

Patas de Sabreman 32 

Fantasma 48 

Bloque movible 63 

«Pedorretas» 66 

Tronco movible 72 

Mesa movible 73 

Charco 74 

Charco con planta 75 

Piedra movible 79 

Bruja 80 

Piedra sube 84 

Piedra sube-baja 85 

Dragón sube-baja 86 

Bloque móvil 1 87 

Bloque móvil 2 88 

Araña aleatoria 89 

Cubo 90 

Piedra inamovible 91 

Dragón móvil 1 92 

Dragón móvil 2 93 


Tabla 4 

Posibles ubicaciones 

de runos 

En cada partida se eligen de for- 
nía aleatoria 5 lugares entre un total 
de 20 posibles. Para modificar algu¬ 
no de estos 20, se deberán hacer los 
siguientes POKES: 

POKE D, Código de la habitación 
POKE D+K Coordenada 1 
POKE D+2, Coordenada 2 
POKE D+3, Coordenada 3 {Veri) 

Cuando D toma uno de los valo¬ 
res siguientes: 


53669 

53673 

53677 

53681 

53685 

53689 

53693 

53697 

5370! 

53705 

53709 

53713 

53717 

53721 

53725 

53729 

53733 

53737 

53741 

53454 


















■ 


respondiente (empieza en 42863 y 
va siendo incrementado en 32) se 
busca una dirección en una tabla, 
utilizando como índice de la misma 
el contenido de (IX+Ü). Entonces se 
salta a esta dirección con un JP 
(HL), asegurándose de que después 
se retomará a 45086, donde continúa 
el bucle principal. Esto me hace 
pensar que (iX+0) contiene un có¬ 
digo ¡dentificador del tipo de objeto 
de que se trata, y que para cada obje¬ 
to hay una parte del bucle que debe 
ser distinta, y que por eso está colo¬ 
cada en una subrutina. Así, según 
cada caso, se llama a una subrutina 
u otra. El problema que tenía ahora 
era averiguar a qué subrutina co¬ 
rrespondía el control de nuestro Sa- 
breman. Por suerte recordé que en 
una de las rutinas llamadas durante 
la inicialízación se hacía un traslado 
de bytes desde otra dirección hasta 
42863, que es justo el comienzo de 
la tabla de objetos. Estos no podían 
ser otra cosa que los datos iniciales 
del personaje (las coordenadas don¬ 
de aparecemos en la pantalla, la di¬ 
rección a la que miramos, etc.). El 
primer byte de éstos era 32, así que 
busqué qué subrutina correspondía 
a dicho código. Esta se encuentra en 
50240. En ella, tras una llamada a 
otra dirección, se testea un bit refe¬ 
rido a IX, y realiza un salto condicio¬ 
nal según su valor. Es casi seguro 
que es aquí donde se comprueban 
las colisiones con otros objetos. 
Pruebo a hacer incondicional el sal¬ 
to, y consigo la ansiada inmunidad. 
Si en vez de hacerlo incondicional, 
lo suprimo, el resultado es que mo¬ 
rimos nada más aparecer en la pan¬ 
talla. 

Un Su per POKE 

La verdad es que una vez encon¬ 
trados los tres pokes que he explica¬ 
do en el apartado anterior, no se me 
ocurría qué otros pokes podían ser 
interesantes. Durante la búsqueda 
de aquéllos había encontrado algu¬ 
nos pokes curiosos por los efectos 
que producían, pero ninguno era 
realmente útil para facilitar la con¬ 


secución del juego. Como me pare¬ 
cía poca cosa lo que había descu¬ 
bierto anteriormente, decidí inten¬ 
tar añadirte al juego algo que no 
tiene y que poseen la mayoría de 
los juegos en tres dimensiones, in¬ 
cluidos Knight Lore y Alien 8: el 
control direccional. Supongo que 
no se lo han puesto porque supone 
la necesidad de una tecla más, sin 
embargo a mí me parece un ver¬ 
dadero fastidio porque estaba acos¬ 
tumbrado a controlar así al persona¬ 
je y no lograba hacerme con el con¬ 
trol rotacional. Para comenzar me 
puse a buscar las rutinas de explora¬ 
ción de teclado y joysticks. Descubrí 
que todas confluían en 48904, don¬ 
de se almacena el dato leído en la di¬ 
rección 42807, de modo que comen¬ 
zó a buscar puntos en los que se hi¬ 
ciera referencia a esta dirección. En¬ 
contré tres. El primero era el que ya 
había visto, en el que es inicializada. 
En el segundo, nada más leído el 
dato, hace un and y se quedacon el 
bit de recogida de objetos, así que 


Sabiendo que el número de 
vidas se almacena en la 
dirección 42785, resulta 
fácil conseguir un poke de 
vidas infinitas. 


ésta no podía ser la rutina principal 
de control del movimiento. Por 
eliminación, debería tratarse del 
tercer punto de los que encontré. 
Mi decepción fue mayúscula al 
comprobar que no era así. En ésta 
se hacía también un and, aunque 
ahora el bit correspondiente a la 
tecla de disparo. La única solución 
era que se refiriera a la dirección 
mediante los registros IX o IY. Pero 
antes de continuar, decidí estudiar 
un poco lo que parecía ser la rutina 
de disparo. Esta rutina crea en la ta¬ 
bla un nuevo disparo siempre que 
no existan ya dos de ellos y que la te¬ 
cla de disparo no la tengamos pulsa¬ 
da desde antes, con esto conseguí 
otros dos pokes, el de poder disparar 



varias veces sin necesidad de soltar 
la tecla entre un disparo y otro, y el 
de disparo automático. Pero lo más 
importante esque encontré el punto 
en el que se creaba la tabla con los 
daots del disparo. Aquí pude ver 
que el código del disparo es 150. En¬ 
tonces pensé: ¿qué pasaría si cam¬ 
biara el código del disparo?, ¿haré 
disparos en forma de roca o algo así? 
Hice la prueba con algunos valores y 
los resultados fueron más que sor¬ 
prendentes. Podemos disparar cual¬ 
quier cosa: desde un tronco que nos 
servirá para subirnos encima, hasta 
una araña que será útil a quien pien¬ 
se que las pantallas son demasiado 
fáciles, pasando por un árbol que 
queda muy decorativo en medio de 
la habitación. Cuando los vi los re¬ 
sultados me puse a probar con to¬ 
dos los códigos. Los resultados más 
interesantes pueden encontrarse en 
la tabla dos. 

El cargador 

Con todo lo que había descubier¬ 
to anteriormente, me encontraba en 
disposición de elaborar un cargador 
con diversas nuevas opciones. 





















I 



Durante el estudio de la rutina de 
disparo encontré una subrutina que 
devolvía la dirección a la que estaba 
mirando el Sabreman. Sabiendo es¬ 
to elaboré la rutina de control direc- 
cional. El principio es muy simple: 
calculo la dirección hacia la que 
queremos dirigirnos y la comparo 
con la dirección hacia la que va Sa¬ 
breman. Si son iguales modifico el 
dato para que el programa crea que 
se ha pulsado la tecla de avanzar. Si 
son distintas, cambio el dato para 
hacer creer al programa que se ha 
pulsado izquierda o derecha, según 
haya que girar a la izquierda o a la 
derecha para pasar de la dirección 
en la que estamos a la dirección en 
al que queremos estar. 

Naturalmente, como utilizamos 
cuatro teclas para las cuatro direc¬ 
ciones, necesitamos otra más para la 
opción de salto. Para este menester 
he reservado la fila de la A a Enter, 
además de la tecla 4. Por estas razo¬ 
nes, el control díreccional no se po¬ 
drá utilizar con la opción de teclado 
(podremos jugar con el teclado, pe¬ 
ro mediante las teclas del cursor o 
las del joystick Sinclair), ni con el 


joystick Sinclair que corresponda a 
las teclas 1-5, así que si queremos el 
control direccional deberemos ulili- 
zar joystick Kempston, los cursores 
o el joystick Sinclair correspondien¬ 
te a las teclas 6-0. 

Con todo lo que había aprendido 
sobre el bucle principal mientras 
buscaba el poke de la inmunidad, no 
me fue demasiado difícil encontrar 
la forma de ir visualizando secuen- 
cialmente las 139 pantallas. El único 
problema fue que éstas no estaban 
numeradas de 0 a 138, como era de 
esperar, sino de 0 a 149, quedando 
enmedio algunos huecos que hacen 
que se bloquee el ordenador al in¬ 
tentar visualizar pantallas inexisten¬ 
tes. 

Por último, pensando en el polifa¬ 
cético poke del disparo, pensé quie 
sería útil poder variar durante la par¬ 
tida el objeto que disparamos. Para 
esto he incluido en el cargador, 10 
teclas con pokes «definibles», y 
que podremos seleccionar pulsando 


Cada objeto, ya sean 
piedras, fantasmas o 
disparos, ocupa 32 bytes. 
Sólo Sobreman ocupa el 
dobie, ya que es tratado 
como dos objetos 
separados. 


en modo pausa una tecla del 0 al 9. 
Los pokes que queramos asignarles 
habremos de ponerlos en la línea 
300 del listado uno, empezando por 
la dirección y el contenido del poke 
para la tecla cero y terminando por 
los de la tecla 9. En la tabla 3 se pue¬ 
den verlos pokes que se incluyen en 
el cargador como ejemplo y que 
pueden ser modificados sin ningún 
problema. 

Una vez introducido el cargador 
pondremos la cinta original. Al fina¬ 
lizar la carga, y si todo ha ido bien, 
aparecerá el conocido mensaje “c 
1982 Sinclair Research ltd.”, pero 
sobre fondo negro y sin borrarse el 
dibujo de la pantalla de presenta¬ 


ción. Ahora podemos introducir 
otros pokes que no necesiten variar 
a lo largo de la partida, y que por tan¬ 
to, no necesiten estar entre tos 10 
predefinidos, como pueden ser et de 
vidas infinitas, o alguno así. Cuando 
hayamos introducido todos tos po¬ 
kes que queramos, ejecutaremos el 
programa con RANDOMIZE USR 
24064. Comprobaréis que el juego 
de caracteres especial del juego ha 
desaparecido, y que los mensajes se 
escriben con el juego de caracteres 
de la ROM, además de que los espa¬ 
cios se sustituyen por iguales. Esto 
es porque he necesitado la memoria 
que ocupaba el juego de caracteres 
para incluir e! cargador con las nue¬ 
vas opciones, ya que no había otro 
lugar libre en la memoria. 

Si todo ha ido bien, el juego em¬ 
pezará normalmente y lo controla¬ 
remos rotacionalmente. Para pasar 
al control direccional, hay que pul¬ 
sar la tecla C o la N en modo pausa. 
Para volver al control rotacional, 
pulsar también en pausa las teclas V 
o B. Además, con la Z podremos 
grabar una pantalla en cinta y con la 
X o la M abollaremos el juego. 

Para visualizar las 139 pantallas 
hay que pulsar ENTER, Para pasar 
rápidamente a la siguiente, pulsar 
Shimbol Shift. Si queremos conti¬ 
nuar el juego desde la pantalla que 
aparezca en ese momento, pulsar 
M. Para terminar de ver el mapa y 
comenzar una nueva partida, pulsar 
SPACE. Hay que tener cuidado con 
la opción M dentro de la opción de 
visualización de pantallas, pues po¬ 
demos aparecer encima de un pin¬ 
cho y perder todas tas vidas una tras 
otra. Para ello, antes de pulsar la M 
hemos de asegurarnos de dónde va¬ 
mos a aparecer, lo cual nos será indi¬ 
cado por una explosión que aparece 
cada vez que pasamos a otra panta¬ 
lla. 

Con todo esto, creo que se facilita 
bastante la tarea de terminar el jue¬ 
go, aunque aún quedan muchas co¬ 
sas por descubrir. Espero que al¬ 
guien se anime a intentarlo. 

Pablo Ariza 
























y * -- 4 

*■ x a > . * . > * *;|¡ 

•■ ■: ■: :>■■■ •■; :■■ -y^ 


Completa tu colección de ZX. 

A continuación te resumimos el contenido de los ejemplares 
atrasados en existencia. 




S/300 | 

ladores 
¡Liarla p. 
Di dígita 


Núm. 6/300 ptas. 

Construya su propio jue 
go/13 programas y monta 
jes/ideas/Software, 


Núm. 3/300 ptas. 

El Spectrum por dentro. 
Quince programas, juegos 
y montajes Software. 


:f:u: OJIA Di 

sorrwMit 

PARA 
U STLCIRIIM 


Núm. 16/300 ptas. 

Cassettes solución a fas 
problemas de grabación, 


Núm. 10/300 

Catorce pro< 
cativos: geogr, 
gralicos. razor 
métricas, etonc 
go máquina. 


m. 7/300 ptas, 

juegos inteligentes/Soft 
re/ 11 programas/U 


Núm: 14/300 ptas. 

Cómo jugar al Hobbii 
Gráficos de funciones. Pro¬ 
gramas de ajedrez, Cone¬ 
xiones con el P l/O, Progra¬ 
mas Multiplic P enseñar de¬ 
leitando. Libros, Forth, ter¬ 
cera parte. 


Núm. 17/300 ptas. 

Mapa de Atic-Afac. Estira 
de caracteres, Dinámica de 
una partícula. Libros. QL 
Magazine. Programas, 
Convertidor analógico-di- 
gital con el P l/O. 


Núm, 11/300 ptas. 

Como crear marcianos y 
otros monstruos. 

Diez programas satélites 
de Júpiter, rescate, interés, 
circulo, préstamo hipoteca¬ 
rio. 


Núm. 3/300 ptas. 

La aventura es la aveniu 
ra/12 programas/Juegos y 
montajes/Código máqui¬ 
na, 


Núm. 6/300 ptas. 

Gráficos y sonido en el 
Spectrum/Libros/Software/ 
13 programas, 


l ,-i. 

W' 

ijtiüa 

mcmiH iW-.JÉÉfc,.. 






■ i 




























EJEMPLARES ATRASADOS 



mmm 

M-r* : 

MO»3Mr¡ 




Núm. 19/300 ptas. 

Mapa de Kmghí Lore. No¬ 
ticias. Critica. Renta 85 (se¬ 
gunda parte). Libros. El ZX- 
81 aprende a sumar. Scrofl 
de ventanas. Programas. El 
software que nos invade. 
BASIC para principiantes 


Núm. 21/300 pías. 

Mapa de Underwurlde. 
Noticias. Critica. ¿Has pro¬ 
bado? Programa especial: 
barquitos. Sois muy diverti¬ 
dos. Libros para ol verano. 
Un poco de física. BASIC 
para principiantes (5), 


Núm. 23/300 ptas. 

Critica. ¿Has probado? 
Profanaron profanado. No¬ 
ticias. Discos para Spec- 
trum, Dossier educación: 
Spoctrum en el aula, auroe- 
val unción, Logo. Código 
máquina. Programación 
especial: quinielas. Monta' 
fe a cámara lenla. BASIC 
para principiantes (7). 


Mapas y trucos de. High- 
way encounler; Tir Na Nog, 
Nightshade/¿Qué es el 
Stack?/Frog rama especial/ 
C od i g o rn áq u i n a / Lo le r ia 
pnmiliva/Stándares de la 
i n to r m á I ica/Pr og rg mas. 


Núm. 18/300 pías. 

Rentas 85. Forth, sexta 
parte. Programas. BASIC 
para principiantes (3). pJot- 
ting Gráficos, Libros. Usua¬ 
rios. Critica. 


Nurru 20/300 ptas. 

Vacaciones con informᬠ
tica. Critica. Noticras. Pro 
gramas. Son muy diverti¬ 
dos. Libros. Generación de 
placas de circuito impreso. 
Forth. Movimiento armóni¬ 
co simple, Spedrum musi¬ 
cal. 


Dwwítr 




Num. 22/300 ptas. 

Noticias. Teclados profe¬ 
sionales. Critica. ¿Has pro¬ 
bado? Programa especial: 
procesador de textos, Ge¬ 
neración de placas de cir¬ 
cuito impreso [segunda 
parte). Prograi., QL espa 
ñol. Quinielas en Spedrum 
BASIC para principiantes 
( 6 ). 


Núm, 24/300 ptas, 

Juegos/Mapas del No¬ 
dos o i Yesocf y Lords oí 
Midnighl/¿Has probado?/ 
Sois muy diveríidos/Usua 
rio/Ajuste de grálicas/MulN- 
s<re h / Pr og r a m a s/Mo n l a 
je: inversor de video para 
ZX 81/Dossier QL, 


Núm. 26/300 ptas. 

Spedrum o QL, invasión 
do los 128/cComo utilizar 
mejor el micrQdrive?/Jue- 
g os/Mapa del Dun Da rae h 
y misión imposible/Progra- 
mación eslruclurada/BA- 
SIC. 


mum. pías. 

Juegos/Espccial juegos 


Num. 27/300 ptas. 

La vida de Srnclair/Pie- 
zas musientes para Spcc- 
Trum/Juegos/Mapas del 
ARNHCM y SABQTEUR/ 
Areas/BASJC para impre- 


DISPONEMOS DE TAPAS ESPECIALES 
PARA SUS EJEMPLARES DE ZX 
(sin necesidad de encuademación) 


Para hacer tu pedido, rellena el cupón adjunto, 
fcsúp' 05 ' córtalo y envíalo HOY MISMO a: 

- ZX, Bravo Murillo, 377 «28020-MADftlD-Tel. 733 74 13 — 


(en cada tomo 
se pueden 
encuadernar 
6 números) 


Los ejemplares atrasados de ZX serán una fuente constante de cono¬ 
cimientos. ideas, soluciones y entretenimientos para el futuro Todo lo 
anterior hace recomendable que los guardes ordenadamente en una de 
las tapas especiales para ZX Cada tapa puede contener 6 ejemplares 
y cuesta solamente 650 ptas 

Ruego me envíen los siguientes ejemplares arrasados de ZX . 

.. .. ..al precio de 3ÜG ptas. cada uno 

Por favor envíen . tapa(s) al precio de 650 ptas. cada una 

{+ gastos de envío) 

El importe lo abonare: 

□ contra reembolso □ cheque adjunto □ con rni tarjeta de crédito 

□ American Exprés □ Visa □ Interbank 

Pecha de caducidad .. 


NOMBRE ..... 

DIRECCION ...... 

POBLACION.....C.P. 

PROVINCIA ....... 


I 






























MTEIFACE SBX Uaa 



El primer programa se encarga 
del envío de una palabra, y el segun¬ 
do de la recepción. A ambos se acce¬ 
de mediante instrucciones DEF FN, 
como se indica a continuación; 

DEF FN E(a)=USR 65024 
DEF FN R()=USR 65081 

La instrucción FN E(x) tendrá el 
efecto de enviar por la línea RS-232 
el valor de x. Si lo usáramos en una 
sentencia de asignación —LET a= 
FN E(x)—, podríamos saber si la or¬ 
den se ha llevado a cabo, o por con¬ 
tra la hemos interrumpido desde te¬ 
clado usando la tecla SPACE. Para 
ello bastará con comprobar si el va¬ 
lor de retorno es mayor que 256. Si 
así fuera, se ha producido un error. 

Asimismo, un LET a=FN R(x) 
asigna a la variable A el número re¬ 
cibido por la línea. La condición es 
la ya comentada. 

En cuanto a los programas en sí, 
hay poco que decir que sea novedo¬ 
so o que no pueda leerse en el lista¬ 
do. En la rutina de emisión, hemos 
de recoger el dato que se nos envía a 
través de un DEF FN. Para ello em¬ 
plearemos una técnica que ya he¬ 
mos usado en otras ocasiones. El 
contenido de DEFADD nos da la 
dirección donde se almacena el ar¬ 
gumento del DEF FN que se está 
procesando —ei que nos interesa 
evidentemente— A partir de esta di¬ 
rección (en el área de variables), re¬ 
cogemos el dato de forma simple ya 
que el número se almacena con for¬ 
mato de entero. 

Por otro lado, recomendamos a 
los interesados en programación en¬ 
samblador que examinen con deta¬ 
lle los bucles de las rutinas de entra¬ 


da y salida. Seguramente les será de 
utilidad. 

En la rutina de recepción se pue¬ 
den detectar errores, producidos ge¬ 
neralmente por desajuste de las ve¬ 
locidades de transmisión. El error 
tiene lugar si el bit de arranque tu¬ 
viera una longitud menor de la espe¬ 
rada. Esto significaría que se están 
transmitiendo datos a más veloci¬ 
dad de la esperada. 

Acaso alguien se halla preguntan¬ 
do por la razón de ubicar este pro¬ 
grama al final de la RAM. Igualmen¬ 
te, los usuarios de Spectrum 16K ha¬ 
brán exclamado: «Maldita sea mi 
suerte». Es necesario hacerlo ya 
que, como muchos sabrán, el acceso 
a los 16 primeros kilobytes de RAM 
sufre interrupciones por parte de la 
ULA, y esto puede hacer inservibles 
los esfuerzos por conseguir una 
temporización exacta. 

Descripción del Hardware 

El interface que presentamos ha 
sido realizado siguiendo la más pura 
filosofía Sinclair, intentando conse¬ 
guir las máximas prestaciones man¬ 
teniendo costes al mínimo. 

Trataremos de ser breves en la 
descripción del hardware. 

El interface está direccionado en 
el puerto de entrada-salida BFh 
(1011 lili). Cuando leemos algún 
dato de este puerto —por ejemplo, 
mediante la instrucción IN A,( )—, 
se activan los buffer triestado de IC2 
por efecto de IClb, El resultado es 
que el Z-80 lee en sus dos bits me¬ 
nos significativos el estado de las 
líneas TXD y DTR. Los transistores 


invierten los niveles, pero como el 
estado bajo corresponde a un uno, y 
al alto al cero, ios datos leídos son 
los adecuados. 

Si accedemos al puerto mencio¬ 
nado en una operación de escritura 
(OUT ( ),<reg>), la salida de la 
puerta ICla se pone en alto y los da¬ 
tos presentes en el bus se cargan en 
los biestables 1C3. Se ha previsto 
que al encenderse el aparato, auto¬ 
máticamente las salidas se pongan a 
cero, pasando de este modo al esta¬ 
do inactivo. 

Para conseguir tensiones negati¬ 
vas hemos usado dos típicas células 
diodo-condensador, en lugar de las 
tradicionales bobinas o transforma¬ 
dores, de difícil obtención o fabrica¬ 
ción. Dado que presentan una im- 
pedancia de salida relativamente al¬ 
ta, ha sido necesario cargarlas con 
una corriente aproximadamente 
constante. 

De aquí el valor inusualmente ba¬ 
jo de la resistencia de colector de T3 
y T4. 

Las resistencias R17 y R18 prote¬ 
gen las salidas frente a cortocircui¬ 
tos accidentales. La protección in¬ 
condicional de las salidas sólo pue¬ 
de garantizarse haciendo uso de 
transistores de más potencia para 
T2, T3, T5 y T6, tales como el BD 
139 y BD 140. No recomendamos la 
opción, a cambio de que se preste 
un mínimo de atención ai realizar 
las conexiones. 

Aunque se ha incluido tanto en el 
esquema como en el circuito impre¬ 
so, generalmente la resistencia en¬ 
tre DSR y masa no se conectará. 
Realmente, es muy poco útil y disi¬ 
pa gran cantidad de calor. 























































































El conectar de salida coincide con el del Interface 1. 
Indicamos a continuación su patillaje: 


Conector RS-232-C 


1: No Conectado (NC) 

2: TXD (Entrada) 

3: RXD (Salida) 

4 : DTR (Entrada) 

5: CTS (Salida) 

6: NC 

7: GND (Tierra) 

8: NC 

9; 89V (DSR gralmente) 














loo 
110 
120 
130 
140 
150 
160 
170 
180 
190 
200 
210 
220 
230 
240 
250 
260 
270 
2S0 
290 
300 
310 
320 
330 
340 
350 
360 
370 
380 
390 
400 
410 
420 
430 
440 
450 
460 
470 
480 
490 
500 
510 
520 
530 
540 
550 
560 
570 


DATA 243,221,42,11,92,221,86,4 
DATA 14,191,237,120,230,1,40,11 
DATA 62,127,219,254,31,56,243 
DATA 6,255,251,201,6,9,122,163 
DATA 23,31,203,195,203,19,237,89 
DATA 205,117,254,16,244,22,3,237 
DATA 81,205,117,254,205,117,254,72 
DATA 251,201,243,14,191,6,1,237 
DATA 65,237,120,230,2,40,15,62 
DATA 127,219,254,31,56,243,6,3 
DATA 237,65,6,255,251,201,205,143 
DATA 254,237,120,230,2,32,239,6 
DATA 128,205,117,254,237,120,31,31 
DATA 203,24,0,48,244,22,3,237 
DATA 81,72,6,0,251,201,253,102 
DATA 71,46,6,0,0,0,45,194,122 
DATA 254,37,0,32,243,0,46,5 
DATA 45,32,253,0,0,35,201,253 
DATA 102,71,46,3,0,0,45,194 
DATA 148,254,37,0,32,244,0,38 
DATA 2,37,0,32,252,201 
REM 
sum=0 

FOR i=65024 TO 65189 
READ a 

sum=5utn + a 

POKE i,a 
MEXT i 

IF sutn=19057 THEN STOP 

PRINT "Error en el DATA. Repáselo" 

REM 

REM Ejemplo 

REM 

DEF FN E(a)=USR 65024 
DEF FN R()=USR 65081 

INPUT "Velocidad de t ransm i s i on: 11 \ vt 
POKE 23681,INT <19200/vt-Ü.5) 

REM Envío de un carácter 

LET a$= 11 A" 

LET b=FN EICODE a*) 

IF b >255 THEN PRINT "ERROR de tr ansnii sion ": STOP 
PRINT "Carácter enviado" 

REM Recepción de un carácter 

LET a=FN r i) 

IF a>255 THEN PRINT "ERROR: velocidad desajustada":STOP 
PRINT "Valor recibi do:"}aj 
IF a>32 THEN PRINT "í"JCHRÍ a;”)"5 
PRINT 











0001 

i************************* 

0002 

(** RUTINA 

DE EMISION *# 

0003 


0004 




0005 

¡(O Luis Miguel BRUGAROLAS 

0006 




0007 




oooe 

RS232 

EQU 

191 

0009 




0010 


QRG 

OFEOOH 

0011 




0012 

EMIRUT 

DI 


0013 


LD 

IX,í3C0BH) 

0014 


LD 

D, ( IX+04)i Cogemos 

0015 

1 


dato a enviar 

0016 


LO 

C,RS232\Di rece ion 

0017 

í 


del puerto 

0010 

DTWT 

IN 

A, (C) S Lee puerto 

0019 


AND 

01 i DTR 

0020 


JR 

Z.EMIT 

0021 




0022 


LD 

A,?FHí Núestreamos 

0023 


IN 

A, ÍOFEHU SPACE 

0024 


RRA 


0025 


JR 

C,DTWT 

0026 




0027 


LD 

B,OFFHi Indicamos 

0020 


El 

f condición de no 

0029 


REI 

; ej ecutado con 

0030 

S 


byte alto a cero* 

0031 

EMIT 

LD 

B,09íNum de bucles 

0032 


LD 

A,Di Dato a enviar 

0033 


OR 

A i CF = 0 

0034 


RLA 


0035 

EMTLP 

RRA 


0036 


SET 

G,E;CTS en bajo 

0037 


RL 

EíEl bit menos signi 

0030 

* 

ficativo de E es el dato 

0039 

? 

a enviar. 

0040 


OUT 

í C) ,E j Lo envi amos 

0041 

i 


con CTS en bajo. 

0042 


CALL 

DEL A Y 

0043 


DJNZ 

EMTLP 

0044 




0045 


LD 

D , 3 

0046 


OUT 

ÍC) ,D 

0047 


CALL 

DELAY 

0040 


CALL 

DELAY 

0049 

1 

LD 

C, B í B = 00 

0050 


El 


0051 


RET 

íVuelve con BC~00 

0052 




0033 


0054 

RUTINA 

DE RECEPCION ** 

0055 


0056 




0057 

RECRUT 

DI 


0Q5S 


LD 

C,RS232 

0059 


LD 

B,01 \ CTS en alto, 

0060 

i 

1 


RXD en bajo. 

0061 


OUT 

(O ,B¡Estamos prepar 

0062 




0063 

UTDT 

IN 

A, (Cl 

0064 


AND 

02; TXD 

0065 


JR 

2,RD;Se recibe bit 

0066 

1 


de comienzo* 

0067 


LD 

A,7FH 

0068 


IN 

A,(OFEH) 

0069 


RRA 



0070 


JR 

C, WTDT 

0071 




0072 

ERROR 

LD 

9,03 

0073 


OUT 

(O , Bl CTS y RXD a i 

0074 


LD 

B,OFFH|Indicamos 

0075 

í 


error. 

0076 


El 


0077 


RET 


0078 




0079 

RD 

CALL 

DEL.5f Esperemos 

0000 

i 


medio periodo. 

0081 


IN 

A, <C> 

0082 


AND 

02)TXD 

0003 


JR 

NZ,ERROR i!Hsy un 

0084 

í 


cera en le 1lnee! 

0085 


LD 

B,10000000B 

0086 

6ETLP 

CALL 

DELAY 

0087 


IN 

A, <C) 

0088 


RRA 


0009 


RRA 

(CF: bit recibido 

0090 


RR 

BtPesa a b7 de B 

0091 


NOP 

(Hace tiempo para 

0092 

í 


compatibi11 zar con 

0093 

í 


DELAY 

0094 


JR 

NCjGETLP 

0095 




0096 


LD 

D, 03( RXD y CTS • 

0097 


OUT 

(C),D( cero 

0098 


LD 

C, B 

0099 


LD 

B.OO 

0100 


El 


0101 


RET 

¡BC: dato recibido 

0102 




0103 

i 44#**#44##*^4****44*^#*4* 

0104 

;## RUTINAS DE RETARDO *# 

0105 

i ************************** 

0106 




0107 




0100 

DELAY 

LD 

H* íIY+71) 

0109 

DELLP2 

LD 

L,ó 

0110 

DELLP1 

DEFB 

0,0,0 

011 1 


DEC 

L 

0112 


JP 

N2,DELLP1 

0113 


DEC 

H 

0114 


NOP 


0115 


JR 

NZ,DELLP2 

Olió 


NOP 


0117 




0118 


LD 

L,5 

0119 

DELLP3 

DEC 

L 

0120 


JR 

NZ t DELLP3 

0121 


NOP 


0122 


NOP 


0123 


INC 

HL 

0124 


RET 


0125 




0126 

DEL. 5 

LD 

H,(IY+^I i 

0127 

DEL.52 

LD 

L, 3 

0128 

DEL,51 

DEFB 

0,0 

0129 


DEC 

L 

0130 


JP 

NZ,DEL.51 

0131 


DEC 

H 

0132 


NOP 


0133 


JR 

NZ,DEL « 52 

0134 


NOP 


0135 


LD 

H, 2 

0136 

DFL 

DEC 

H 

0137 


NOP 


0138 


JR 

NZ,DEL 

0139 


RET 






RESISTENCIAS (1/4 W, 5%); 

R1,2 = 2K 

R3, 4= 1K 

R5= lOOhm 

R6, 7 = 4K7 

R8, 9 = 100K 

RIO, 11 = 33K 

R12, 13 = 330 Ohm 1/2 W 

R14 = 330Ohm IW 

R15,16= 15K 

R17, 18, 19,20 = 47 Ohm 

R21,22 = IK 

R23.24, 25 = 10K 

TRANSISTORES: 

TI = BC547 (BC548,9) 

T2 = BC557 (BC'558,9) 

T3, 4, 7, 8= SC159U 
T5, 6, 9, Í0 = SC149B 

CONDENSADORES 
Cl = 4,7 nF 
C2= lOOnF 
C3,4 = 470 [íF 16V 
C5 = 470 (iF 25V 
C6, 7= lOOnF 

DIODOS: 

DI.2,3, 4,5= IN4I48 
D6, 7 = Zener 7,5V I/4W 

CIRCUITOS INTEGRADOS: 

ICI = 74LS27 

IC2 = 74LSI26 

IC3 = 74LS74 

tC4 = 555 



























































































































































COBRA'S 

ARC 




DINAMIC 

SPECTRUM 48 K 


Los sacerdotes de una cultura 
milenaria vivían plácidamente 
en un reino lejano, dedicados por 
entero a la veneración del dios 
Cobra. En su honor construyeron 
un templo inmenso en el que 
durante siglos fueron 
depositando tesoros, joyas, oro... 
Asustados por las profecías del 
adivino Werdhal, que vaticinaba 
un maremoto que asolaría sus 
tierras, construyeron alrededor 
del tesoro un inmenso barco, tan 
grande como una pirámide. Un 
inmenso barco que quedo 
perdido entre las gigantescas 
olas cuando la profecía se 
cumplió; íejos, muy lejos, nadie 
sabe dónde. 

Los aficionados a los juegos de 
aventura «genuinos» estamos de 
enhorabuena. No es cosa 
corriente el que se produzcan 
este tipo de juegos por y para 
hispanoparlantes, y la verdad es 
que ya estábamos hartos de 
andar de aquí para allá con el 
diccionario intentando 
acoplamos al molesto «argot 
anglosajón» que suelen utilizar. 
Una vez más ha sido Dinamic 
quien ha roto el muro que parecía 
impedir a las casas españolas el 
sacar a la luz juegos de este tipo. 
Pero no por ser una excepción va 
a librarse este juego de la 
implacable critica que es común 
en estas páginas, y ya va siendo 
hora de que nos internemos en el 
juego para ver qué puede tener 
de positivo y qué de menos 
positivo. 

Junto a la buena presentación y 
cuidado por el detalle (algo, por 
otra parte, difícilmente separable 
del nombre de Dinamic), debe 
resaltarse el uso que se hace de 


un menú de iconos como forma 
de dirigir al personaje en lugar 
del clásico diálogo, más 
complejo, pero seguramente 
preferido por todo aventurero 
que se precie. De todas formas 
no deja de ser algo bastante «al 
día» que es agradecióle como 
forma de experimentar nuevas 
vías en este mercado. Además 
cada mensaje de Jos que nos da 
el ordenador es acompañado por 
su correspondiente frase (sí, 
habla, pero de forma bastante 
«gangosa» y a un nivel bajísimo). 


Cuando nos adentramos algo en 
el juego nos encontramos con 
que deja bastante que desear a 
quien esté acostumbrado a los 
grandes juegos de aventura 
ingleses como son el Hobbit o 
tantos otros. La flexibilidad de 
movimientos, personajes y 
diálogos tan patente en estos no 
se encuentra fácilmente cuando 
tenemos que limitarnos a un 
pequeño juego de iconos y 
seguir un flujo demasiado rígido 
para conseguir permanecer vivos 
algunos minutos. 



























FRIDAY 

THE 13TH 

DOMARK_ 

SPECTRUM 48 K 

Basado en la conocida pelícuJa 
de Ja Paramount, Viernes 13, es 
este un juego que se ha dado a 
conocer de tal forma por la 
estudiada campaña de marketing 
que le ha precedido, que hoy 
hablan de él incluso quienes 
jamás han llegado a probarlo. 
Comienza a ser esto algo normal, 
derivado del increíble 
crecimiento del mercado en los 
últimos tiempos y su gran 
dinamismo. Un juego hoy sólo 
está en cartel durante dos o tres 
meses, y en ese tiempo no da 
tiempo a que corra la voz de la 
crítica popular como en los 
primeros tiempos; aquellos 
tiempos heroicos en los que sólo 
nos decidíamos a gastar nuestro 
dinero en un juego cuando era 
de dominio público que éste era 
una obra de arte. Hoy las cosas 


comentando en esta sección. 

Un tranquilo día de campo en el 
lago de cristal va a ser turbado 
cuando Jason, un zombie en toda 
regla, comienza a atacar a tus 
amigos y compañeros de 
acampada. Deberás buscarlo 
entre ellos y luchar con él para 
vencerle. Recuerda que sólo hay 
un lugar donde Jason no se 
atreve a entrar; allí donde se 
encuentre la cruz podrá ser el 
santuario donde se refugien tus 
amigos. Valor y adelante. 

Como podemos ver, la trama 
inicial (por otra parte 
condicionada por la película) es 
bastante clásica y no aporta 
apenas nada realmente 
interesante, pero lo más 
significativo es que tampoco 
descubramos nada innovador 
cuando nos fijamos en la parte 
técnica del asunto. Unos sprites y 
gráficos en general bastante 
«sosos», dos dimensiones, un 
mapa más bien pequeño,... en fin, 
que pasó por nuestros ojos sin 
llamarnos la atención en 
absoluto. Tampoco es que tenga 
grandes defectos ni faltas graves, 
pero hoy en día es necesario algo 
más que un carecer de defectos 
para triunfar en un mercado tan 
saturado de títulos. 


han cambiado, ios intereses 
económicos son muy fuertes y no 
son ya programadores los que 
controlan las empresas de 
software, sino especialistas en 
publicidad y psicología de 
masas. 

Pero hay que recordar que bajo 
cada título hay un programa para 
nuestro ordenador, un programa 
que es lo que va (o no) a 
hacernos disfrutar y lo que se 
supone que deberíamos estar 







































WINTER 

GAMES 

EPYX 

SPECTRUM 48 K 


y «se pega a los dedos» con 
facilidad. En presentación se 
cumple a la perfección, 
haciéndolo un juego muy 
completo dentro del ámbito que 
le corresponde. El estar dividido 
en dos partes (tres pruebas por 


cara, al viejo estilo) permite a los 
programadores derrochar más 
memoria y trabajar más a gusto, 
aunque, como parte negativa, el 
jugador perderá bastante tiempo 
con las tediosas cargas del 
cassette. 



Aunque parece que ha pasado 
algo la fiebre de los juegos 
deportivos que aquél «Decathlon» 
puso tan de moda, aún siguen 
vendiéndose «versiones» más o 
menos diferenciadas entre si que 
casi permiten hablar de una 
importante subclase de juegos; 
juegos que han marcado un hito 
en la «movida» evolución de este 
interesante mercado en los 
últimos años. 

Pero es esta vez un juego que 
aporta algo nuevo a esta 
repetitiva clase. Como indica su 
propio nombre se trata de unos 
Juegos de Invierno, con sus 
pruebas características que 
ponen las cosas interesantes 
desde el comienzo. 
Preparémonos para competir 
sobre la nieve y el hielo en las 
más duras pruebas a las que 
puede verse sometido un curtido 
deportista invernal. 

Bobsled, salto de ski, patinaje 
artístico, patinaje estilo libre, Hot 
Dog aéreo y ski de fondo son las 
competiciones en las que 
deberemos probar nuestra 
pericia. Pruebas entretenidas y 
bien acabadas en general que 
hacen de este juego (Decathlon 
aparte) todo un «cabeza de lista» 
dentro de su gama. Típico juego 
de competición, sólo resulta 
realmente divertido cuando son 
muchos tos jugadores que se 
turnan en busca del oro (admite 
hasta ocho posibles). 

En la parte técnica cabe resaltar 
unos fondos muy espectaculares 
junto a un personaje principal 
demasiado sencillo pero bien 
animado. La sensación es buena 



Truc hit rirss 


-HOTS PULSE 


CQKTESTAMT 


























CATALOGO DE SOFTWARE 
PARA ORDENADORES 
PERSONALES IBM 


TODO EL CATALOGO DE SOFTWARE 
CON MAS DE 800 FICHAS 




1. a ENTREGA 3.500 — PTAS. 
(400 FICHAS + FICHERO) 

RESTO EN TRES 
ENTREGAS TRIMESTRALES 
DE 1.500,— PTAS. CADA UNA. 


PRECIO TOTAL DE LA SUSCRIPCION ■ 8.000.— PTAS. 


CUPON DE PEDIDO 

El importe lo abonaré: POR 
CON MI TARJETA DE CREDITO 

CHEQUE □ 
□ 

CONTRA'htE EMBOLSO □ J 
Re f CATALOGO DE SOFTWARE , 

SOLICITE HOY MISMO 

EL CATALOGO DIRECTAMENTE A 

Cargue 8.000 ptas a mi tarjeta American Express □ Visa □ interbank 

Numeres fie mi tarjeta 

1 

1 

1 

¡ntoúis.s .1 

Fecha de caducidad _ _ 

Firma 


i 

MOMRRF _ 



l 

BRAVO MORILLO, 377 - 5.° A 
28020 MADRID 

O EN LOS CONCESIONARIOS IBM 

CAI i F 



i 

K 

CIUDAD 


n p 

I 

1 

PROVINCIA 



l 

































VECTRON 

3D 

FIREBIRD 


por tan extraño laberinto en 
cualquier cosa menos fácil, 
aunque con unas buenas dosis 
de concentración podemos 
conseguir cierto control de vez 
en cuando. La sensación es 
buena, y la cosa se pone aún 
más interesante cuando 
conseguimos ponernos a la cola 
de algún enemigo para 


acribillarle con las nutridas 
ráfagas del láser de abordo. 

De todas formas la velocidad de 
nuestra nave es excesiva para 
quien comienza (y también para 
el que no es tan novato), y 
desgraciadamente no puede ser 
modificada al gusto del jugador, 
que suele acabar chocando 
contra las paredes y las naves 
que circulan en sentido contrario 
a los pocos segundos. La opción 
«map», que sobreimpresiona un 
plano del laberinto y sus 
«habitantes» no sirve de mucho, 
pues la nave sigue moviéndose a 
su enorme velocidad, y no se 
puede prestar atención a las dos 
cosas. 

Dejando a un lado esos 
pequeños grandes detalles que 
lo hacen tan complicado para 
nuestras humanas mentes, hay 
que hablar de un juego bastante 
logrado técnicamente y que, a la 
vez que puede catalogarse como 
un clásico, se sale bastante de la 
forma de ser de la mayoría de los 
títulos que están apareciendo 
últimamente. Un juego que 
rebosa acción por los cuatro 
costados y que pondrá las cosas 
difíciles a quienes se las den de 
¡mbatióles en programas de este 
tipo. 


SPECTRUM 48 K 


Nos encontramos con un 3D de 
lo más puro, uno de esos juegos 
en los que se sacrifica casi todo 
por conseguir una buena 
sensación de tridimensionalidad 
y perspectiva. Se trata de un 
clásico laberinto en el que sólo 
nos encontraremos con un 
sencillo punto de mira, fas líneas 
que representan las paredes, y 
unos enemigos no tan 
esquemáticos como nos tienen 
acostumbrados en este tipo de 
juegos. La velocidad conseguida 
es muy grande para la relativa 
calidad de ios gráficos y su 
interesante animación. 

El conducir nuestros Spectrum 



















GHOST’N 


GOBLINS 



ELITE _ 

SPECTRÜM 48 K 


Por fin ha visto la luz Ja versión 
para Spectrum de este juego, tras 
haber pasado por las manos de 
millones de jugadores en las 
típicas «máquinas de 
marcianitos» de miles de bares y 
salas de recreativos. Se repite 
esa maniobra que ya nos resulta 
familiar como es lanzar versiones 
de estos juegos para todos los 
micros domésticos, justo cuando 
su nivel de atracción en ese otro 
mercado comienza a disminuir, y 
aprovechando que todavía son 
muchos los «viciosos» que darán 
cualquier cosa por tener su 
programa favorito en casa y no 
tener que soltar «cinco pavos» 
cada vez que deseen hechar una 
partida. Parece que Elite se está 
convirtiendo en una especialista 
en esto como pudo comprobarse 
no hace mucho con esos 
«bombazos» que fueron (y siguen 
siendo) Commando y Bomb Jack. 
Como todos los que tienen esa 
procedencia, se trata de un juego 
en el que prima la acción. Todo 
su atractivo reside en unos 
sprites «simpáticos» que se 
mueven muy rápida y muy 
suavemente. Un secreto que 
empieza a ser de dominio público 
y que no falla: denle al jugador un 
personaje sencillo pero con 
mucha velocidad de reacción, de 
forma que consiga «sentirse él», y 
le harán feliz. 

Nuestro protagonista deberá 
moverse a lo largo de 
cementerios, riscos y otros 
lúgubres parajes en busca de la 
bella princesa que se hafla presa 
de un pérfido y endemoniado 
señor feudal. Habrá de tener 
cuidado de esquivar o destruir a 
los abundantes «zombis» que 
surgen de las entrañas de la 


tierra con el objeto de acabar con 
las escasas vidas de que dispone 
nuestro héroe. Otros enemigos 
también se disputarán el acabar 
con nosotros, por lo que 
deberemos ser generosos en el 
uso de las inacabables armas de 
que disponemos. 

El acabado general del programa 
no es del todo malo, pero ha sido 
bastante recortada la versión 
original para conseguir acoplarla 
al nuevo ordenador. Lo que más 


ha cambiado ha sido la parte 
gráfica, sobre todo lo referente a 
los colores, dadas las 
limitaciones del Spectrum en este 
sentido. Esto es un fuerte revés 
para este juego y desde luego 
rompe mucho el «encanto» que 
éste tenia para ese público que to 
puso en la cúspide en su día. 
Todo un «matar o huir para 
sobrevivir», destroza los nervios 
de cualquiera a las pocas 
partidas. De eso se trata, ¿no? 


5 












Compresión 
de textos 

A la hora de almacenar textos en la memoria del 
ordenador, lo más corriente es colocar sobre cada una 
de las posiciones de la RAM un código ASCII 
exclusivamente, sin más complicaciones. De esta 
forma, si 35 Kb corresponden a 35840 bytes, utilizando 
la misma cantidad de memoria se podrán almacenar 
35840 caracteres codificados en ASCII. Pero, todo sea 
por aprovechar hasta el último byte de nuestro micro, 
esta situación puede cambiar ahorrando una tremenda 
cantidad de memoria gradas a una sencilla rutina en 
código máquina. 

E l juego de caracteres del SPEC- 
TRUM está formado por 96 le¬ 
tras, números y signos especia¬ 
les. Cada uno de estos caracteres es¬ 
tá definido por un código ASCII 
comprendido entre 32 y 127. 

Si nos fijamos en el formato bina¬ 
rio de esta codificación, veremos 
que el 7. ü bit nunca es utilizado; el 
código más alto, 127, corresponde 
en binario a 01000000. 

De momento esto supone ya un 
cierto derroche de memoria, aun¬ 
que no en grandes cantidades, al es¬ 
tar cada dirección de la RAM com¬ 
puesta por 8 bits. 

Se podría hacer una rutina que 
aprovechara al máximo esos 8 bits 
(ya veremos más adelante cómo se 
hace) utilizando el juego entero de 
caracteres pero no merece la pena 
ya que sólo nos ahorraríamos un by¬ 
te por cada 8. Es decir, que utilizan¬ 
do solamente 7 bits para cada carác¬ 
ter, lograríamos almacenaren 35 Kb 
de memoria 40960 caracteres. De to¬ 
das maneras, supondría ya un aho¬ 
rro de 5120 bytes, pero somos muy 


«agarrados» y queremos exprimir 
nuestro paciente SPECTRUM has¬ 
ta límites insospechados. 

Mutilación del juego 
de caracteres 

Con nuestra manía de ahorrar, 
vamoa a ver ahora que tal nos iría 
empleando para cada carácter sola¬ 
mente 6 de los 8 bits que conforman 
su código. 

Lo primero que deducimos con¬ 
siste en que el juego de caracteres 
quedaría reducido a 64 combinacio¬ 
nes diferentes (entre 0 y 63 deci¬ 
mal). Tomemos el manual del orde¬ 
nador y consultemos el apéndice A 
(tabla del juego de caracteres). Si 
contamos los 64 caracteres disponi¬ 
bles a partir del código 32 (espacio), 
veremos que podemos disponer de 
todos los números, letras mayúscu¬ 
las y signos más importantes. Las 
minúsculas quedarían excluidas pe¬ 
ro lo que nos queda es más que sufi¬ 
ciente para emplearlo en un peque¬ 
ño procesador de textos sin grandes 














ambiciones estéticas. La imposibili¬ 
dad de utilizar las letras minúsculas 
se compensa por el hecho de que 
nos vamos a ahorrar un byte por cada 
4 caracteres. ¡Siguiendo con el mis¬ 
mo ejemplo, en 35 Kb de memoria 
podremos almacenar hasta 47786 
caracteres! Conseguiremos eludir a 
la «Hacienda» de nuestro ordena¬ 
dor 16946 bytes netos. 

Todo esto está muy bien, pensará 
el lector, ¿pero cómo es posible al¬ 
macenar 4 caracteres en tres bytes? 
Esto es lo que veremos a continua¬ 
ción. 

Un carácter y un tercio 
en un byte 

Si el Z-80 tuviera una configura¬ 
ción de 6 bits no habría ningún pro¬ 
blema para lo que queremos hacer 
(pero repercutiría gravemente a la 
hora de programara! ofrecer un jue¬ 
go de instrucciones menor). El 
asunto está en aprovechar los 8 bits 
de cada una de las localizaciones de 
memoria para que pueda caber un 
código (el cual estará formado por 6 
bits) y una parte de otro. La figura 1 
muestra cómo puede conseguirse 
este fin. De esta manera, por cada 
tres grupos de bytes en memoria, lo¬ 
gramos empaquetar 4 caracteres. El 
primer byte del grupo contiene un 
carácter completo más un tercio del 
siguiente. El segundo, dos tercios 
del segundo carácter y dos tercios 
del tercero, y el tercer byte un tercio 
del tercer carácter más el cuarto ca¬ 
rácter completo. Para entendernos 
con las explicaciones que vendrán 
seguidamente vamos a llamar a este 
grupo comprimido de caracteres 
«paquete». 

Compensión/codificación 

Habíamos quedado en que sola¬ 
mente utilizaríamos los caracteres 
cuyos códigos están comprendidos 
entre 32 y 95. Aparentemente esto 
supone un ligero problema, ya que 










Compresión de textos 


entonces deberíamos emplear 7 bits 
para cada carácter. El problema deja 
de existir si cambiamos la codifica¬ 
ción. Al operar con sólo 64 caracte¬ 
res, podríamos muy bien asignar el 
código 0 para el primer carácter de la 
lista y 63 para el último. En la prácti¬ 
ca, la rutina resuelve esto restando 
32 del código ASCII antes de proce¬ 
der a su tratamiento. 

La rutina codificadora utiliza un 
buffet cuya dirección está contenida 
en la etiqueta START (esta direc¬ 
ción la puede variar el usuario «po- 
keando» en las direcciones 65002 y 
siguiente). En este bufi'er es donde 
se va a almacenar cada una de las pᬠ
ginas de texto que queremos com¬ 
primir. Una vez terminada una pági¬ 
na de texto (que consta de 672 by¬ 
tes, es decir, una pantalla completa), 
se procede a su compresión. Reali¬ 
zada su tarea, la rutina codificará la 
página en 168 paquetes de 3 bytes 
(504 bytes) a partir de la dirección 
contenida en la etiqueta TEXTO 
(dirección 65000 y siguiente). En es¬ 
ta dirección, al utilizar por primera 
vez la rutina, el usuario deberá mar¬ 
car en formato de dos bytes la direc¬ 
ción de inicio del texto comprimido. 
Cada vez que se vayan codificando 


Por cada tres grupos 
de bytes en memoria, 
logramos 

«empaquetar» cuatro 
caracteres. 

más páginas de texto, el contenido 
de START se irá incrementando en 
504. 

Rotaciones e instrucciones 
lógicas 

La filosofía de la rutina se caracte¬ 
riza por el empleo constante de las 
instrucciones lógicas (AND y OR) y 
las rotaciones. El programa toma el 
primer byte de la dirección cocnte- 
nida en la etiqueta START, le resta 
32 a su contenido y realiza dos rota¬ 
ciones a la izquierda (RLCA) de tal 
forma que el formato binario del có¬ 
digo se sitúe en el extremo izquier¬ 
do del byte. Seguidamente se acce¬ 
de al contenido de la siguiente di¬ 
rección, se le resta igualmente 32 y 
se procede a una operación AND 


para poner a 0 los bits 0,1, 2 y 3 de) 
byte en cuestión (AND 00110000) 
preservando el contenido de los bits 
4 y 5. Inmediatamente se realizan 
cuatro rotaciones a la derecha (RR- 
CA) para colocarlos en el extremo 
derecho. Después de recuperar el 
anterior byte tratado que había que¬ 
dado a salvo en el Stack, una opera¬ 
ción OR hace que se mezclen en un 
mismo byte aquellos 6 bits con los 
dos de ahora. El resto del programa 
se basa en acciones similares, hasta 
haber formado un paquete. Un bu¬ 
cle condiciona] hace que se repita la 
misma operación 168 veces (168x4 
=672 caracteres) gracias al contador 
situado en la etiqueta CONTA. Una 
vez terminado todo el proceso, la 
etiqueta TEXTO contiene ya la si¬ 
guiente dirección a partir de donde 
se almacenará la siguiente página 
comprimida. 

Decodificación e 
impresión 

La rutina anterior no serviría de 
nada sí no se dispusiera de otra que 
decodificara los caracteres compri- 



1 REM ORLANDO ARAUJO MARTIM 

2 REM PRUEBA COMPRESOR 

3 REÍ1 22 JUNIO 1986 

4 

5 GO SUB 900 

9 LET START-290OO 
12 LET TE X T □=300 OO 

19 POKE 65001,1NT <TEXTO/256): 
POKE 65000,TEXTO—íINT (TEXTO/25 

6 >*256) 

20 POKE 65003,INT (START/256): 
POKE 65002,START-(INT ÍSTART/25 

6>*256) 

400 POKE 23728,32; LET N=Q 
500 RANDOMIZE U5R 65189 
510 RAND0MI2E ÜSR 65008 
525 BO SUB 720 

605 LET r-PEEK 23728; LET r=r + 1 
: POKE 2372B,r 

610 IF PEEK 2372S-96 fHEN GO T 
0 700 

630 LET N=N+1; 60 Tü 500 
700 CLS : PRINT 11 QUE FAGINA DES 
EA CONSULTAR?" : 1NPUT " 

710 IF N<O OR N>63 THEN 30 TO 
700 


711 80 SUB 720 

713 PAUSE Oí CLS ? GO TO 700 
720 LET PAG=TEXTO+ (N*5Q4) : POKE 
65007,INT (PAG/256): PÜKE 65006 
t PAG-UNT (PAB/256 ) *256 ) ; RANDOM 
IZE U8R 65099 
725 RETURN 

900 LET con-O: FOR i-65000 TO 6 
5187i READ ai LET con-con+a: FOK 
E i ,a? NEJíT i 

910 IF con<>23575 THEN PRINT 
FLASH 1;"ERROR EN DATAS RUTINA C 
OMPRESÜRA": STOP 

920 REM cargador tzndigos 

921 RESTORE 2000: LET con=G: FO 
R 1=65189 TO 65212; READ a: LET 
con E con+áü POKE i,a 

922 NEXT i 

923 IF con<>2361 THEN PRINT 
rror en datas cargador códigos' 1 2 3 4 5 6 : 

STOP 

950 REIURN 

1001 DATA 40,119,72,113,0,0,48,1 
17,1,168,0*237,67,236,253,42,234 
,253,237,91,232,253,126,214,32 

1002 DATA 7,7,245,35,126,214,32, 


230,48,15,15,15,15,193,176,18,19 
,126,214,32,230,15,7,7,7 

1003 DATA 7,245,35,126,214,32,23 
0,60,15,15,193,176,18,19,126,214 
,32,15*15,230,192,245,35,126,214 

1004 DATA 32,193,176,18,19,35,23 
7,75,236,253 1 11,237,67,236,253 1 1 
21,184,32,184,237,83,232,253,201 
,205 

1005 DATA 107,13,62,2,205,1,22,4 
2,238,253,17,168,0,126,245,230,2 
52,15/15,198,32,229,213,215,209 

1006 DATA 225,241,230,3,7,7,7,7, 
245,35,126,230,240,15,15,15,15,1 
93,176,198,32,229,213,215,209 

1007 DATA 225,126,230,15,7,7,245 
,35,126,230,192,7,7,193,176,19B, 
32,229,213,215,209,225,126,230,6 
3 

1008 DATA 198,32,229,213,215,209 
,225,35,27,122,187,32,181 

1009 

2000 REM datos cargador codtgas 
2100 DATA 22,21,58,176,92,95,42, 
234,253,6,32,115,35,16,252,6,32 
2110 DATA 21,122,254,0,32,244,20 
1 









1 ;ORLANDO ARflUJO MARTIN 

2 ;CODIFICADOR TEXTO 

3 ;17 de junio de Í9B6 

4 3 

5 ? 

6 TEXTO EQU ¿5000 

7 START EQU 65002 

8 CONTA EQU 65004 

9 PAG EQU 65006 
10 

11 QRG 65008 

12 ENT * 

13 LD BC,16B 

14 LD (CQNTA) t EC 

15 ;contador caracteres 

16 LD HL,(START) 

17 ¡¡dirección comienza buffer 
te^ta a codificar 

1S LD DE,(TEXTO) 

19 ;carga en DE la dirección 
actualizada te^íto a codificar 

20 BUCLE LD A,(HL) 

21 SUB 32 

22 ;carga en A el codigo del 
primer carácter del grupo 

23 RLCA 

24 RUCA 

25 ;2 desplazamientos a la íz 
quierda del carácter 

26 PUSH AF 

27 INC HL 

28 ;acceso al siguiente carac 
ter del buffer 

29 LD A,í HL) 

30 SUB 32 

31 ;carga del carácter 

32 AND X00110000 

33 jse toman los dos últimos 
bits del carácter 

34 RRCA 

35 RRCA 

36 RRCA 

37 RRCA 

38 ;y se desplazan hacia la d 

erecha * 

39 POP BC 

40 ;recuperadon del primer c 
racter 

41 ÜR B 

42 ;mezcla de las 6 bits del 
primer carácter con los 

43 ;dos primeros del segundo 

44 LD (DE),A 

45 ;y se almacenan al estar y 
a codificados 

46 INC DE 

47 ; acceso a la siguiente d¡ir 
eccion del tes^to codificado 

48 LD A,ÍHL) 

49 SUB 32 

50 ;se vuelve a tomar el segu 
ndo carácter 

51 AND 7-000011 i 1 

52 ;considerando solamente lo 
s cuatro primeros bits 

53 RLCA 

54 RLCA 

55 RLCA 


56 RLCA 

57 j,para rotarlos a la izquie 

r da 

5B PUSH AF 

59 INC HL 

60 LD A,(HL) 

61 SUB 32 

62 * acceso y carga al tercer 
carácter 

63 AND 7.00111100 

64 ;tomando en consideración 
los cuatro últimos bits 

65 RRCA 

66 RRCA 

67 ;2 rotaciones a la derecha 

68 POP BC 

69 OR B 

70 ¡recuperación de los 4 pri 
meros bits del segundo ca- 

71 ;racter y mezcla con 1 os 4 
últimos del tercero 

72 LD (DE),A 

73 ;y almacenamiento del conj 
unto 

74 INC DE 

75 LD A, (HL í 

76 SUB 32 

77;acceso de nuevo al tercer 
carácter 

78 RRCA 

79 RRCA 

80 ;2 rotaciones a la derecha 
del carácter 

8 i AND 7.11000000 

82 ;se salvan los das primero 
s bits del carácter 

83 PUSH AF 

B4 I NC HL 

85 LD A, (HL) 

86 SUB 32 

87 ;acceso al cuarto carácter 

88 POP BC 

89 OR B 

90 ;y mezcla con los dos prim 
eros bits del anterior 

91 LD (DE) T A 

92 INC DE 

93 :almacenarniento del tercer 
codigo del grupa 

94 INC HL 

95 LD BC.ÍCONTA) 

96 DEC BC 

97 LD (CONTA),BC 

98 LD A,C 

99 CP B 

100 JR NZ,BUCLE 

101 LD (TEXTO) ,DE 

102 RET 

103 

104 i RUTINA DECQDIFICADDRA 

105 

106 CALL #0D6B 

107 ;borra pantalla 

108 LD A,2 

109 CALL #1601 

110 ;abre canal 2 

111 LD HL, (PAB > 

112 ;pagina elegida 


113 

LD 

DE,168 

114 

;contador caracteres 

115 1 

LQOP LD 

A,EHL) 

116 

PUSH 

AF 

117 

AND 

7.11111100 

118 

RRCA 


119 

RRCA 


120 

ADD 

A,32 

121 

PUSH 

HL 

122 

PUSH 

DE 

123 

RST 

#10 

124 

PDP 

DE 

125 

POP 

HL 

126 

PDP 

AF 

127 

AND 

7 . 00000011 

128 

RLCA 


129 

RLCA 


130 

RLCA 


131 

RLCA 


132 

PUSH 

AF 

i 33 

INC 

HL 

134 

LD 

A,tHL) 

135 

AND 

7.11110000 

136 

RRCA 


137 

RRCA 


í 38 

RRCA 


139 

RRCA 


140 

POP 

BC 

141 

OR 

B 

142 

ADD 

A ,32 

143 

PUSH 

HL 

144 

PUSH 

DE 

145 

RST 

#10 

146 

POP 

DE 

147 

POP 

HL 

140 

LD 

A,(HL) 

149 

AND 

7.000011 11 

150 

RLCA 


151 

RLCA 


152 

PUSH 

AF 

153 

INC 

HL 

154 

LD 

A, í HL) 

155 

AND 

7.1 ÍOOOOOO 

156 

RLCA 


157 

RLCA 


158 

POP 

BC 

159 

OR 

B 

160 

ADD 

A ,32 

161 

PUSH 

HL 

162 

PUSH 

DE 

163 

RST 

#10 

164 

POP 

DE 

165 

POP 

HL 

166 

LD 

A, £HL) 

167 

AND 

7.00111111 

168 

ADD 

A , 32 

169 

PUSH 

HL 

170 

PUSH 

DE 

171 

RST 

#10 

172 

POP 

DE 

173 

POP 

HL 

174 

INC 

HL 

175 

DEC 

DE 

176 

LD 

A, D 

177 

CP 

E 

178 

JR 

NZ * LOOP 

179 

RET 











Compresión de textos 


1i BYTE ¡ Si BYTE ¡ 3!BYTE 

i i 









n 

















CARACTER 

¿¡¡CARACTER 

^CARACTER 

1 t -k—j-i- 

ÜCHRRCTER 


EHPhüUEThMIENTO ¡DE CUhTRÜ 
CRRfiCTERES (CON FQRMñTQ 
DE 6 BITS) EN TRES BYTES. 


midos y los imprimiera. Gracias a 
ella podremos acceder a una página 
cualquiera del texto y ver su conte¬ 
nido. 

Como cualquier rutina de impre¬ 
sión, ésta comienza llamando a la 
rutina del sistema operativo 
OD6BH que limpia la pantalla y se 
abre seguidamente el canal 2 de im¬ 
presión. En el registro HL se alma¬ 
cena la página que deseamos con¬ 
sultar, cuyo dato está contenido en 
la etiqueta declarada al comienzo 
del programa; PAG. En esta direc¬ 
ción (65006), antes de llamar a la ru¬ 
tina decodificadora, el usuario debe 
almacenar en formato de dos bytes 
la dirección de inicio de la página a 
consultar. Por supuesto, para hacer 
las cosas más fáciles, en ei programa 
BASIC que controle la rutina, sólo 
deberá introducirse el número de pᬠ
gina mediante un INPUT (siendo 0 la 
primera página). Un sencillo cálculo 
en una línea BASIC se encargará 
de calcular la dirección a la que co¬ 
rresponde la página según el dato 
introducido y POKEará los datos re¬ 
sultantes a partir de la etiqueta 
PAG. 

En DE colocamos el contador 
que ¡nicializamos a 168 (168x3=504 
bytes a decodificar). Se toma el pri¬ 
mer byte de la página eliminándose 
el contenido de los dos primeros bits 
(AND 11111100). Se rota el byte dos 
posiciones a la derecha y se le suma 


32 a su contenido. De esta manera 
conseguimos obtener el código AS¬ 
CII original. Ahora ya no tenemos 
mas que imprimirlo aprovechando 
lallamadaala ROM RST 10H. ¡Pero 
cuidado! Siempre, antes de llamar 


una rutina ROM, debemos preser¬ 
var el contenido importante de los 
registros que estemos utilizando en 
la rutina. En este caso, debemos de 
poner a salvo HL (puntero del texto 
comprimido) y DE (contador del 
bucle) y llamar inmediatamente a la 
rutina de impresión que imprimirá 
en la pantalla el código contenido 
en A. Entonces ya podemos volver a 
recuperarlos del Stack mediante 
POP. El resto del programa es seme¬ 
jante al anterior por lo cual no nos 
alargaremos demasiado. Al igual 
que aquél, se hace uso de las ins¬ 
trucciones de rotación y las opera¬ 
ciones lógicas. Una vez realizada 
una pasada dentro del bucle, se ha¬ 
brán imprimido 4 caracteres que an¬ 
teriormente estaban firmemente 
compactados en un paquete de tres 
bytes. 











































Las presentes rutinas en 
código máquina han sido 
diseñadas para poder 
rellenar (Fifi) cualquier 
figura con posibilidad de 
utilizar entramados 
definidos por nosotros. 
Ocupan un total de 415 
bytes, no son reubicables 
y han sido situadas juntas 
a partir de la dirección 
64900 (para dejar sitio a 
los UDGs). Estas rutinas 
son la coloreadora 
propiamente dicha y la 
rutina entramadora. 


miíL 














5.2 Y 

PUNTOS POR LOS QUE VA PASANDO 
LA RUTINA QUE RELLENA LA LINEA 


La rutina coloreadora se utiliza 
definiendo una función de la forma: 

DEF FN n(a,b,c)=USR Ó49ÜÜ 
y llamándola con una orden como: 

LET a=FN n(X,Y,cc) 

siendo n el nombre de la función, X 
e Y las coordenadas de un punto 
cualquiera en el interior de la figura 
a colorear, y cc una condición. Si cc 
vale 1, entonces además de colorear 
se crea una tabla especial e impres¬ 
cindible si se desea luego utilizar al¬ 
gún tipo de entramado. Si ce vale 0 
no se crea esta tabla ahorrando me¬ 
moria (la tabla ocupa una gran can¬ 
tidad de memoria) y permitiendo al 
uso de la rutina en programas largos 
o bien en máquinas de 16K —con el 
previo ajuste de la rutina y reubica¬ 
ción de la misma. 

Esta tabla se crea desde el co¬ 
mienzo de la rutina (dirección 
64900) hacia abajo. En caso de que 
la tabla bajara más allá del RAM- 


La tabla utilizada para el 
entramado ocupa mucha 
memoria , por lo que en 
Spectrum 16 K debe 
suprimirse. 


TOP se provocaría el error “out of 
memory”. Por tanto debemos pre¬ 
viamente introducir una orden 
CLEAR nn, dejando el espacio ne¬ 
cesario a la tabla. En caso de usar la 
opción de no creación de la tabla 
(cc=0) no debemos preocuparnos 
de esto último. 

Además, la rutina devuelve al 
BASIC en eJ registro doble BC el 
número de puntos que han sido 
PLOTeados. Así, si ejecutamos la 
orden: 

LET a=FN n(X,Y,cc) 
en la variable a tendremos el núme¬ 


ro de los puntos que «caben» dentro 
de la figura. 

Esto puede ser útil —a parte de la 
mera curiosidad— para calcular, por 
ejemplo, la superficie de cualquier 
«cosa» por complicada que sea con 
sólo dibujarla en la pantalla y colo¬ 
rearla; en ese caso la superficie ven¬ 
dría dada en «pixels cuadrados» que 
en función de la escala se podrían 
pasar a las unidades que fueran ne¬ 
cesarias. 

Otra curiosidad es que el rellena¬ 
do de una figura puede ser parado 
en cualquier momento pulsando la 
tecla «SPACE». Esta parada será 
siempre tras el relleno de una línea 
completa de la figura. El resto de las 
funciones, como la posibilidad de 
uso de entramados o la cuenta del 
número de puntos rellenados, fun¬ 
cionarán igual que si la figura se ter¬ 
minara allí. 

La rutina entramadora se utiliza 
también definiendo una función de 
la forma: 



































































¡m iMí&Mm 



DEF FN n(a)=USR 649)4 

y llamándola con una orden como: 

LET a=FN n(dir)) 

siendo dir la dirección donde se ha¬ 
lla situado el entramado dentro de la 
memoria. El entramado es un gráfi¬ 
co de 16 x 16 pixels que por tanto 
ocupa un total de 32 by tes. Este grᬠ
fico se almacena en memoria por fi¬ 
las de 16 bits, siendo la primera fila 
la que se define de izquierda a dere¬ 
cha por los dos primeros bytes; los 
dos siguientes definirían la segun¬ 
da, los dos siguientes la tercera y así 
sucesivamente. 

Como mucha gente no está habi¬ 
tuada a esta forma de almacenar los 
gráficos, se dispone también de la 
posibilidad de utilizar los UDGs A, 
B, C y D para definir el entramado. 
En este caso la figura estaría forma¬ 
da por estos cuatro gráficos siendo 
la mitad superior la formada por los 
gráficos A y B y la mitad inferior la 
formada por los gráficos C y D. Si se 


El entramado puede 
definirse usando los UDG A, 
B,CyD. Si se elige esta 
opción, la rutina lo adapta 
al otro formato. 


elige esta opción, la dirección que se 
debe indicar como inicio del gráfico 
es la 0, encargándose la rutina de 
adaptar el gráfico al otro formato de¬ 
positándolo en la memoria interme¬ 
dia de la impresora. Así, si se desea 
adaptar un gráfico del formato 
UDGs al otro bastará con entramar 
una figura pequeña o bien introdu¬ 
cir el siguiente POKE: 

POKE 64899,255 

de esta forma no se entramará nada, 
realizándose sólo el proceso de 
adaptar el gráfico. Una vez hecho 
esto (con el parámetro tf/r=0) basta¬ 
rá con trasladar esos 32 bytes que 
forman la figura a donde convenga. 


A diferencia de la otra rutina, la 
entramadora no retorna en BC el 
número de puntos, por lo que el va¬ 
lor de la función no tendrá ningún 
sentido. Añadir además que se pue¬ 
de cambiar el entramado cuantas 
veces se quiera mientras no se des¬ 
truya la tabla coloreando una nueva 
figura con la opción ce=l. 


Funcionamiento 

El funcionamiento de las rutinas 
es algo complejo por lo que aconse¬ 
jo, a los que quieran «atreverse» con 
el listado ensamblador, que primero 
lean estas líneas. 

A) El funcionamiento de la rutina 
coloreadora es simple en teoría, 
aunque se complica un tanto en el 
listado ensamblador. 

Para colorear la figura se utiliza 
un STACK que sirve para guardar 
las coordenadas de las zonas o 
líneas que se dejan para «más ade- 





















































































































TABLA DE POKES: 

(Para ahorrar entramados) 


Figura Normal 

POKE 65220,31 
Figura Horizontal 

POKE 65220,23 
Figura Normal POKE 

65263,122 
POKE 65264,144 
Espejo Vertical 

POKE 65263,120 
POKE 65264,146 


lante» mientras se colorea otra zona 
distinta. Como STACK se usa el del 
Z-80 con órdenes tan simples como 
PUSH o POP. 

Para seguir el proceso hay que te¬ 
ner presente las figuras. 

1. Se comprueba si el punto en las 
coordenadas actuales está alzado 
{POINT (x,y>—1). En caso afirmati¬ 
vo la zona en cuestión no tendría 
nada que colorear, por lo que se pa¬ 
saría a la siguiente zona. 

2. Se busca el límite derecho de la 
línea a colorear (ver fig. 1). 

3, A continuación se introduce en 
la tabla (si la condición cvale 1) la 
coordenada Y y la coordenada X fi¬ 
nal (del límite derecho). 

Esta tabla está formada por gru¬ 
pos de 3 bytes, siendo el primero la 
coordenada Y y el segundo y tercero 
las coordenadas Xf¡ na l y X¡ n ¡ c ¡ a i res¬ 
pectivamente. Caso de que la coor¬ 
denada Y sea 255 (imposible) se to¬ 
ma como final de la tabla por la ruti¬ 
na entramadora, siendo esta la se¬ 
ñal. 

Esta tabla se completa introdu¬ 
ciendo el tercer byte cuando se ter¬ 
mina el rellenado de una línea. 


4. A continuación se inicia el re¬ 
llenado de la línea (de derecha a iz¬ 
quierda). Primero se PLOTea en las 
coordenadas actuales y luego se 
comprueban los puntos inmediata¬ 
mente inferior y superior. Si no hay 
nada (POINT (x,y)=0), entonces se 
almacenan en el STACK las coorde¬ 
nadas de ese punto (vacío) y se acti¬ 
va o alza un banderíz. Este banderín 
evita que el STACK se llene de 
coordenadas innecesarias para el 
completo rellenado de la figura. Pre¬ 
viamente a la introducción de las 
coordenadas en el STACK se com¬ 
prueba este banderín y si está alzado 
no se realiza la introducción. 

En caso de que el punto esté alza¬ 
do, entonces se baja dicho banderín 
porque esto quiere decir que puede 
venir a continuación una nueva zo- 


La rutina entramadora se 
limita a leer la tabla creada 
por la otra rutina y poner o 
quitar los puntos 
correspondientes. 


na (ver fig. 2). Esta comprobación se 
realiza tanto en la zona superior co¬ 
mo en la inferior, pues puede suce¬ 
der en ambas lo mismo. 

Cuando se termina de rellenar 
una línea repitiendo el mismo pro¬ 
ceso y decrementando la coordena¬ 
da correspondiente, se pasa a una 
nueva zona. (Una línea se completa 
al encontrar un punto alzado o bien 
el borde de la pantalla). 

Para pasar a una nueva zona o 
línea, se ponen a cero los banderi¬ 
nes y se sacan del STACK las nue¬ 
vas coordenadas. Hecho esto se 
comprueba si estas coordenadas son 
la señal previamente introducida 
antes de comenzar a rellenar la figu¬ 
ra. Sí lo son, se retorna al BASIC de¬ 
volviendo el número de puntos 



PLOTeados; si no, se vuelve a ini¬ 
ciar el proceso de rellenado de una 
línea. Fíjese el lector que cuando se 
comprueba durante el rellenado de 
una línea si los puntos superior e in¬ 
ferior están a 0, si es necesario se in¬ 
troducen las coordenadas de dicho 
punto en el STACK; por lo que al 


QLHARD 

TODO PARA SU QL 

• RAM DI SC 

• AMPLIACIONES DE MEMORIA 

• UNIDADES DE DISCO 

• EPROM CON TOOLKIT PARA 
M. PERIPHERIAL 

• SOFTWARE 


Escribir s ApTDO 37165 BARCELONA 
Llamara Tel.: (93) 321 27 25 


PROGRAMAS PARA QL 

Juegos, Utilidades y comerciales, gran variedad, 

50 títulos a 2.500/3.500 ptas. También programas 
para ATAR! 520/1040. __ 

Ordenadores Sinclair OL con garantía y 9 
programas variados 43-900 pías 
ATARI 520 ST c/ Monitor FV - Disco Ratón y 
programas 1 51 350 pías 
ATAftr 1040 c/ Monitor FV * Pisco Ratón y 
programas 204 900 pías 
ATARI 1040 cf monitor color - 01 seo Ratón y 
programas 222.750 ptas. (precios sin IVA) 
_ ENVIOS CONTRA REEMBOLSO _ 

VALENTÉ computación 

Santa Engracia, &&2SQ1Q Madrid Tel.; 445 32 B5 
Solicite GRATIS Boletín rntormativo 

















«i» 



sacar las nuevas coordenadas del 
STACK se continúa en la línea que 
previamente había sido detectada 
como vacía y n es necesario que la 
rutina se encargue de subir o bajar 
una línea para seguir rellenando. 

Como curiosidad, puede decir 
que si la rutina colorea primero de 
arriba a abajo, es porque en el 
STACK se introducen primero las 
coordenadas de los «huecos» que se 
detectan debajo, y luego los de arri¬ 
ba. Por ello, como el STACK es de 
tipo LIFO (last in, first out), las últi¬ 
mas coordenadas son las superiores. 

B )El funcionamiento de la rutina 
entramadora se limita a leer la tabla 
creada por la otra rutina y poner o 
quitar los puntos que corresponda, 
siendo esto lo más complicado, por 
lo que paso a explicar cómo se sabe 


si se debe poner o quitar un punto. 

Para empezar, se loma como ori¬ 
gen de entramados las coordenadas 
del punto desde el que se comenzó a 
colorear la figura. Las fórmulas que 
se usan para saber qué punto se de¬ 
be comprobar en el entramado para 
luego ser copiado en pantalla son las 
siguientes: 

x - (CXorigen - CX) MOD 16 

Y = (CY origen - CY) MOD 16 

CXcmgeri CX o CY or ¡g eT1 —CY pue¬ 
den ser negativos, pero como en có¬ 
digo máquina los números negati¬ 
vos se expresan como complemento 
a dos, ni se tiene en cuenta. Veamos 
un ejemplo: 

Tenemos un entramado cual¬ 
quiera (fig. 3) y queremos saber qué 
le corresponde a un cierto punto 


PROTEJA SU SPECTRUM PLUS CON ESTA 



PRACTICA FUNDA 


A UN PRECIO ESPECIAL 


OFERTA LIMITADA 
Y EXCLUSIVA PARA 
NUESTROS LECTORES 


Aproveche ía oportunidad de mantener 
como nuevo su Spectrum Plus 
con esta funda, y beneficíese 
de un 30% de descuento 
sobre su precio normal. 






miijmvwm. 


10 


0RG 

64000 

520 


PUSH 

BC 

1030 


LD 

A, C 

20 

FILL 

LD 

IX,<23651) 

530 


LD 

A,(INCX) 

1040 


CP 

255 

30 



LD 

B,(IX+3) 

540 


LD 

D, A 

1050 


JR 

NZ,F_SIG5 

40 



LD 

C,<IX+2) 

550 


LD 

A, B 

1060 


RET 


50 

FILL2 

PUSH 

BC 

560 


SUB 

D 

1070 

F _8165 

LD 

A, 1 

60 



LD 

A,2 

570 


LD 

B, A 

1080 


LD 

(INCY),A 

70 



CALL 

#1601 

580 


CALL 

PÜINT 

1090 


PUSH 

BC 

80 



LD 

IX 7 FLAGS 

590 


POP 

BC 

1100 


LD 

A,(INCX) 

90 



LD 

A,1 

600 


JR 

NZ,F BUC2 

1110 


LD 

D, A 

100 



LD 

(INCY), A 

610 


BIT 

1,(IX+O) 

1120 


LD 

A, B 

110 



LD 

íINCX),A 

620 


JR 

NZ,F BUC3 

1130 


SUS 

D 

120 




BC,65367 

630 


SET 

1,(IX+O) 

11 40 


LD 

B, A 

130 



LD 

(STACK),BC 

640 


CALL 

PUSH 

1150 


CALL 

POINT 

140 



LD 

BC,65535 

650 


JR 

F_BUC3 

í J60 


POP 

BC 

150 



CALL 

PUSH 

660 

F_PT02 

SET 

0,<IX+0) 

1170 


JP 

NZ ,F_BUC1 

160 



PDF 

BC 

670 


DEC 

c 

1180 


LD 

A,(INCX) 

170 

F 

_BUC1 

LD 

(COI ,8C 

660 


LD 

A, 255 

1190 


LD 

D, A 

180 



RES 

0,<IX+Ü> 

690 


LD 

íINCY),A 

1200 


XGR 

A 

190 



CALL 

PLOT 

700 


LD 

(CC1),BC 

1210 


SUB 

D 

200 

F 

BLIC2 

RES 

1,(IX+O) 

710 


LD 

BC,(CC) 

1220 


LD 

(INCX),A 

210 

F 

_BUC3 

LD 

A,íINCY) 

720 


JR 

F_BUC2 

1230 


JP 

F BUC1 

220 



ADD 

A, C 

730 

F_PT03 

BIT 

3, ( IX+O) 

1240 

PÜINT 

LD 

A, #7F 

230 



LD 

C,A 

740 


JR 

NZ,F_BUC5 

1250 


IN 

A,(#FE) 

240 



CALL 

PDINT 

750 


SET 

3,(IX+O) 

1260 


AND 

1 

250 



JR 

Z,F_PTQ1 

760 


CALL 

PUSH 

1270 


JR 

NZ,P_SIG2 

260 



BIT 

0,CIX+O) 

770 


JR 

F_BUC5 

1280 


RST 

8 

270 



JR 

Z,FPTQ2 

780 

PUSH 

LD 

HL ,(STACK) 

1290 


DEFB 

12 

200 



LD 

A,tINCX) 

790 


LD 

DE,ZF IN 

1300 

P_SIG2 

PUSH 

BC 

290 



ADD 

A,B 

000 


INC 

DE 

1310 


CALL 

#22AA 

300 



LD 

B, A 

810 


PUSH 

HL 

1320 


LD 

B, A 

310 



INC 

C 

820 


AND 

A 

1330 


INC 

B 

320 



LD 

(CC2),BC 

830 


SBC 

HL, DE 

1340 


LD 

A,(HL) 

330 



LD 

BC, ÍGCD 

B40 


POP 

HL 

1350 

PBUC1 

RLC 

A 

340 



RES 

3,<IX+Ü) 

850 


JR 

NZ,F_5IG3 

1360 


PJ NZ 

P_BUC1 

350 



LD 

A,(INCX) 

860 

F_ERft 

RST 

8 

1370 


AND 

1 

360 



ADD 

A, B 

870 


DEFB 

3 

1380 


NDP 


370 



LD 

B, A 

080 

FSIG3 

LD 

(HL),B 

1390 


NOP 


380 

F 

_BUC4 

CALL 

PÜINT 

890 


DEC 

HL 

14Q0 


POP 

BC 

390 



JR 

Z t F_PT03 

900 


LD 

(HL>,C 

1410 


RET 


400 



RES 

3,íIX+O) 

910 


DEC 

HL 

1420 

PLOT 

PUSH 

BC 

410 

F. 

„BUC5 

LD 

HL,<CC2) 

920 


LD 

(STACK) f HL 

1430 


CALL 

#22E5 

420 



AND 

A 

930 


RET 


1440 


POP 

BC 

430 



SBC 

HL , BC 

940 

PQP 

LD 

HL,(STACK) 

1450 


RET 


440 



LD 

A, H 

950 


INC 

HL 

1460 

FLAGS 

DEFB 

0 

450 



0R 

L 

960 


LD 

C,<HL) 

1470 

INCX 

DEFB 

0 

460 



JR 

Z ,POP 

970 


INC 

HL 

1480 

INCY 

DEFB 

0 

470 



LD 

A,(INCY5 

900 


LD 

B, (HL) 

1490 

CC 

DEFW 

0 

480 



ADD 

A, C 

990 


LD 

(STACK),HL 

1500 

CC1 

DEFW 

O 

490 



LD 

C, A 

1000 


LD 

A, B 

1510 

CC2 

DEFW 

0 

500 



JR 

F_BUC4 

1010 


CP 

255 

1520 

STACK 

DEFW 

0 

510 

F. 

_FTQ1 

CALL 

PLOT 

1020 


JR 

NZ,FSIG5 

1530 

ZF IN 

END 









ORIGEN DE ENTRAMADOS 


¡mu (ímmm 



(59, 60) si el origen de entramados 
está en {62,57). Para ello acudimos a 
las fórmulas: 

X = (62 - 59) MGD 16 
Y = (57 - 60) MOD 16 

siendo X=3 e Y=13 (si no le da esto 
mire a ver si ha efectuado bien el 
complemento a dos para números 
negativos). Basta ahora con fijarnos 
en el estado del punto con coorde¬ 
nadas (3, 13) en el entramado, y sa¬ 
bremos que le corresponde un 1. 
(La X es la coordenada horizontal y 
la Y es la vertical). 

Esto es algo así como si conside¬ 
ráramos el entramado como si fuera 
un baldosín y llenáramos con esos 
' baldosines la figura. El origen de en¬ 
tramados es el punto de partida de 
los baldosines. Este origen coincide 
con el punto medio superior del 
baldosín (fig. 5) que está debajo del 
origen. 

Si utilizáramos los UDGs A, B, C 


Dado que la rutina 
entramadora lee de la tabla 
y no la destruye, se puede 
cambiar el entramado 
cuantas veces se necesite. 


y D como entramado sin cambiar¬ 
los, veríamos algo asi como lo que se 
aprecia en la figura 6 respecto al ori¬ 
gen de entramados. 

Dado que la rutina entramadora 
lee de la tabla y no la destruye, pode¬ 
mos cambiar el entramado cuantas 
veces queramos hasta que se cam¬ 
bie la tabla para otra figura. (O se 
anule ésta con el POKE anterior¬ 
mente mencionado). 

Como ejemplo de lo dicho prueba 
lo siguiente: 

CIRCLE 127, 87, 85: 

LET a=FN a (127, 87, 1) 


(suponiendo que la función defini¬ 
da se llame a). Pruebe ahora: 

LET a=FN b(dir) 

(suponiendo que la función se llame 
6); y procure que dir tenga un valor 
dentro de la ROM. Podrá repetir es¬ 
ta orden cambiando dir cuantas ve¬ 
ces quiera. 

Pruebe ahora dir= 15000. Podrá 
ver que rellena por completo, pues 
la dirección 15000 y siguientes están 
dentro de «agujero negro» de la 
ROM. 

A los programadores que usen 
muchos entramados les aconseja¬ 
mos que consultaran la tabla de PO- 
KES, que los guardaran directa¬ 
mente en memoria y que los salva¬ 
ran al cassette en forma de BYTES 
en lugar de crearlos en el propio pro¬ 
grama. 

•*- - 

Feo. Javier Ellees Vallejo 






























ROTACION 



El mes pasado vimos cómo podía realizarse la inversión de gráficos 
definidos por el usuario en dos sentidos diferentes (horizontalmente 
y verticalmente). En el presente artículo trataremos un tema similar 
aunque algo más largo de llevar a buen término que el anterior. 
Con la rutina que vamos a desarrollar podremos orientar cualquier 
UDG en cuatro direcciones diferentes, lo cual supone un ahorro 
mayor que en el caso de la inversión. 


S i ei mes pasado lográbamos ob¬ 
tener 2 UDGs a partir de uno, 
con la actual rutina obtendre¬ 
mos 4 diferentes. 

Este programa en Código Máqui¬ 
na permite orientar un UDG en 4 di¬ 
recciones distintas. El efecto conse¬ 
guido al llamar reiteradamente la 
rutina es una rotación del UDG, ro¬ 
tación que puede conseguirse a vo¬ 
luntad tanto de derecha a izquierda 
como de izquierda a derecha. 

Una de las muchas utilidades que 
pueden deducirse a primera vista 
podría ser la simulación del movi¬ 
miento rotatorio de las ruedas de un 
automóvil. En lugar de crear cuatro 
gráficos diferentes, bastaría con 
crear uno sólo y llamar a la rutina. 
Así de sencillo. De igual forma, si 
tiene pensado programar un «Co- 
mecocos», no tiene más que limitar¬ 
se a crear una única figura del famo¬ 
so «cometan tasmas». Las otras tres 
orientaciones del «pac-man» las irá 
calculando la rutina por usted. 


Existen otras muchas aplicacio¬ 
nes destinadas a juegos que con se¬ 
guridad irá descubriendo según sus 
necesidades de programación. 


La rutina utiliza cuatro 
variables diferentes que 
se almacenan en otras 
tantas direcciones de 
memoria 


Ideas básicas de la 
rotación 

De la misma forma que comenza¬ 
mos en el anterior articulo, antes de 
nada debemos imaginarnos el pro¬ 
ceso dejando a un lado el ordenador 
y los fríos mnemónicqs Assembler, 
ya que si no se tienen las ideas bien 


claras, llegar a la solución del pro¬ 
blema, programando directamente, 
puede ser un verdadero rompecabe¬ 
zas. 

De inmediato nos encontramos 
con un problema que ofrece dos si¬ 
tuaciones diferentes. Por un lado, 
podemos rotar el UDG de derecha a 
izquierda, y por el otro, de izquierda 
a derecha. Estudiemos de momento 
la primera situación. 

Imaginemos un cuadrado dibuja¬ 
do en un papel dividido en 8x8 celdi¬ 
llas. Cada una de estas celdillas co¬ 
rresponden a los bits individuales de 
cada una de las filas o bytes del 
UDG. Numeramos secuencialmcn* 
te cada una de las celdas del 1 al 64. 
Seguidamente, damos un cuarto de 
vuelta al papel (de derecha a iz¬ 
quierda). El siguiente paso consiste 
en estudiar los cambios que han su¬ 
frido los bits del UDG para obtener 
una regla común que será la que nos 
permitirá llegar al futuro algoritmo 
de rotación. 


















. 














ROTACION DE 




Esto es lo que descubrimos. El úl¬ 
timo bit de la primera fila ocupa la 
í . a posición de la primera fila; el últi¬ 
mo bit de la segunda fila ocupa el se¬ 
gundo lugar de la primera fila; el úl¬ 
timo de la tercera, el tercero de la 
primera, y así sucesivamente hasta 
haber completado la primera lila. 
Entonces, los siguientes bits que se 
trasladan son los penúltimos de ca¬ 
da una de las 8 filas que se van des- 


E1 programa fuente 

La rutina hace uso de cuatro va¬ 
riables almacenadas a partir de otras 
tantas direcciones de memoria. En 
la dirección 59996, la rutina almace¬ 
na un número que según sea 0 ó 1, 
accedemos a la rotación derecha- 
izquierda o izquierda-derecha res¬ 
pectivamente. En las 59999, intro¬ 
ducimos el n.° de orden del UDG a 


ción de! n.° del UDG que ya vimos 
en el anterior artículo. Si la ejecu¬ 
ción es a partir de la dirección 60007, 
se carga en la mencionada dirección 
un 1 y el programa sigue su curso a 
partir de START. Después de haber 
procedido a la ya comentada multi¬ 
plicación por 8 (operación que sirve 
para tener un acceso inmediato al 
UDG elegido), un bucle LDIR car¬ 
ga a partir de la tabla salva una co- 



plazando a los 8 lugares correspon¬ 
dientes de la segunda fila. El proce¬ 
so se repite hasta haber completado 
la totalidad de las filas. 

En el caso de que la rotación fuera 
de izquierda a derecha, el proceso 
sería inverso; el 1bit de la 8. a fila se 
traslada al lugar que ocupaba el l.° 
de la 1. a fila; el último de la 7. a fila va 
al lugar dei segundo puesto de la pri¬ 
mera, etc. 

Esta es la base teórica de nuestra 
rutina. Teniendo presente estas 
ideas, ya podemos pasar a realizar el 
programa fuente sin grandes dificul¬ 
tades. 


rotar (0 a 20). La dirección 59997 y 
siguiente, la utiliza el propio progra¬ 
ma para almacenar el comienzo de 
la dirección de una tabla a partir de 
la cual almacenamos una copia de 
los datos del UDG. Esta última di¬ 
rección será utilizada por el registro 
índice IX. 

La rutina puede llamarse de dos 
formas diferentes. Si deseamos una 
rotación derecha-izquierda, habrá 
que ejecutarla a partir de la direc¬ 
ción 60000, almacenándose en la di¬ 
rección 59996 un 0 para saltar inme¬ 
diatamente a la etiqueta START 
donde se procede a la multiplica- 


pia del UDG para tener un mode 
lo intacto con el cual puedan efec¬ 
tuarse las comparaciones. Para te¬ 
ner acceso a estos datos, vamos a 
emplear el registro IX como punte¬ 
ro, con lo cual lo cargamos con la di¬ 
rección original contenido en salva 
(líneas 30 a 32). 

Seguidamente, cargamos de nue¬ 
vo HL con el comienzo de la direc¬ 
ción del UDG e iniciamos una serie 
de contadores que nos servirán para 
llevar a cabo los constantes bucles 
dentro de los cuales se desarrollan 
las comparaciones de cada uno de 
los bits. 









ROTACION DE W 



1 

;Orlando Araujo 

41 

LD D, 8 

2 

;ROTACION UDGs 

42 

;D=contador de los bytes d 

3 

;3 MAYO 1986 

el UDG 1 

4 



43 


5 



44 

BYTE LD B ,8 

6 

ORG 

60000 

45 

;B=contandor de cada uno d 

7 

ENT 

$ 

e los 

bits de los bytes del UDG 

8 

LD 

A, 0 

46 

BUC LD C,(IX+0> 

9 

LD 

(59996),A 

47 

;Se carga en C el primer b 

10 

JR 

START 

ytes a 

i comparar y tratar 

11 

;Rotación derecha-izquierd 

48 

LD A,(59996) 

a 



49 

CP 0 

12 

LD 

A,1 

50 

JR Z,BITD 

13 

LD 

(59996),A 

51 

;Si se ha elegido la rotac 

14 

¡Rotación i 

z quierda-derech 

ion der/izq se salta a BITD 

a 



52 

JR BITI 

15 

START LD 

A,(59999) 

53 

¡Si no, a BITI 

16 

SLA 

A 

54 

OTRA JR NZ,SETUP 

17 

SLA 

A 

55 

VEZ INC IX 

18 

SLA 

A 

56 

;Acceso al siguiente dato 

19 

LD 

E,A 

del UDG protegida 

20 

LD 

D , 0 

57 

DJNZ BUC 

21 

LD 

HL,(23675) 

58 

;Cuando B=0 se salta a BUC 

22 

ADD 

HL, DE 

para 

tratar otro byte 

23 

;Acceso al 

UDG elegido med 

59 

LD (HL),E 

i ante 

multiplicación por 8 de n. 

60 

;Se carga en la dirección 

UDG 



correspondiente del UDG 

24 

LD 

(59997),HL 

61 

;el dato de-finitivo 

25 

LD 

BC , 8 

62 

LD IX,(23728) 

26 

LD 

HL,(59997) 

63 

;Se vuelve a reiniciali zar 

27 

LD 

DE,SALVA 

IX con la dirección 

28 

LD IR 


64 

;etiquetada SALVA 

29 

;Se almacena el UDG Qrigin 

65 

INC HL 

al en 

otra dirección para prateg 

66 

DEC D 

er 1 o 



67 

LD E ,0 

30 

LD 

HL,SALVA 

68 

LD A, D 

31 

LD 

(23728),HL 

69 

RET Z 

32 

LD 

IX,(23728) 

70 

JR BYTE 

33 

;En IX se guarda la dírecc 

71 

¡¡Salta para el siguiente d 

ion del primer dato del 

ato 


o 4 

;UDG protegido 

72 

BITD LD A,D 

35 

LD 

HL,(59997) 

73 

CP 8 

36 

; Se carga en HL el comienz 

74 

JR Z ,BIT0 

o de 

la dirección 

del UDG elegid 

75 

CP 7 

o 



76 

JR Z,BITI 

37 

LD 

m 

O 

77 

CP 6 

38 

;Se inicializa a 0 el regi 

78 

JR Z,BIT2 

stro ¡ 

E ya que va 

a se el 

79 

CP 5 

39 

;que contendrá cada uno de 

SO 

JR Z,BIT3 

los bytes resultantes 

81 

CP 4 

40 

;del UDG tratado 

82 

JR Z,BIT4 














ROTACION DE 





El primer byte a comparar (1. a fila 
del UDG) se carga en C utilizando 
¡X como registro índice (línea 46) y 
seguidamente chequeamos el con¬ 
tenido de la dirección 59996 para lle¬ 
var a cabo el tipo de rotación elegi¬ 
do. Para no alargarnos excesiva¬ 
mente, vamos a ver únicamente la 
rotación derecha-izquierda. Si se ha 
elegido esta última opción, el pro¬ 
grama salta a BITD. A partir de esta 
etiqueta se carga en A el contenido 
de D, que inicialmente vale 8 (cada 
vez que haya sido tratada una fila 
del UDG, se irá decrementando). 
Inmediatamente se compara el con¬ 
tenido de este registro con valores 
comprendidos entre 8 y U. En este 
caso, al ser el contenido de D=8, un 
salto condicional desvía el progra¬ 
ma a la etiqueta BITO donde se com- 


B3 


CP 

3 

108 

BIT 1 

BIT 


84 


JR 

Z,BIT5 

109 


JR 

OTRA 

95 


CP 


1 10 

BIT2 

BIT 

2,C 

86 


JR 

Z,BIT6 

111 


JR 

□ TRA 

87 


CP 

1 

1 12 

BIT3 

BIT 

3,C 

88 


JR 

Z,BIT7 

113 


JR 

□TRA 

89 

BIT I 

LD 

A, D 

114 

BIT4 

BIT 

4,C 

90 


CP 

8 

1 15 


JR 

OTRA 

91 


JR 

Z,BIT7 

116 

BITS 

BIT 

5,C 

92 


CP 

7 

1 17 


JR 

□TRA 

93 


JR 

Z,BIT6 

1 18 

BIT6 

BIT 

6 , C 

94 


CP 

6 

119 


JR 

OTRA 

95 


JR 

Z,BITS 

120 

BIT7 

BIT 

7 , C 

96 


CP 

5 

121 


JR 

OTRA 

97 


JR 

Z,BIT4 

122 

SETUP 

LD 

A, (59996) 

98 


CP 

4 

123 


CP 

0 

99 


JR 

Z,BIT3 

124 


JR 

Z,SETUP1 

100 


CP 

3 

125 


JR 

SETUP2 

101 


JR 

Z,BIT2 

126 

SETUP1 

LD 

A , B 

102 


CP 

2 

127 


CP 

8 

103 


JR 

Z , BIT1 

128 


JR 

Z,SET7 

104 


CP 

1 

129 


CP 

7 

105 


JR 

Z , BIT 0 

130 


JR 

Z,SET6 

106 

BITO 

BIT 

0,C 

131 


CP 

6 

107 


JR 

OTRA 

132 


JR 

Z,SET5 










ROTACION DE 



para el contenido del bit 0 de la fila 
que estamos tratando. Un salto in¬ 
condicional (JR OTRA) hace que 
nuestro programa vuelva hacia atrás 
a la etiqueta especificada donde nos 
encontramos con la instrucción JR 
NZ SETUP. Si el resultado anterior 
no ha sido cero (es decir, si el bit que 
hemos examinado estaba alzado) 
accedemos a la dirección etiquetada 
por SETUP (donde volvemos de 
nuevo a ver si estamos tratando la 
rotación d/i o i/d). Como hemos 
elegido la rotación d/i, saltamos a 
SETUP) y allí chequeamos el con¬ 
tenido de B para saber qué número 
de orden del bit se quiere alterar. De 
esta manera, saltamos a SET7 don¬ 
de se alza el primer bit del byte con¬ 
tenido en E (que inicialmente vale 
0). De esta forma ya hemos conse- 



1.4“^ 

CP 

5 

158 

CP 

1 

134 

JR 

Z,SET4 

159 

JR 

Z , SET7 

135 

CP 

4 

160 



136 

JR 

Z,SET3 

161 SET7 

SET 

7, E 

137 

CP 

3 

162 

JP 

VEZ 

13S 

JR 

Z,SET2 

163 SET6 

SET 

6 ,E 

139 

CP 

o 

jL 

164 

JP 

VEZ 

140 

JR 

1 ,SET1 

165 SET5 

SET 

5, E 

141 

CP 

1 

166 

JP 

VEZ 

142 

JR 

Z,SETO 

167 SET4 

SET 

4,E 

143 SETUP2 

LD 

A , B 

168 

JP 

VEZ 

144 

CP 

8 

169 SET3 

SET 

3, E 

145 

JR 

Z,SETO 

170 

JP 

VEZ 

146 

CP 

7 

171 SET2 

SET 

2, E 

147 

JR 

Z,S£T1 

172 

JP 

VEZ 

148 

CP 

6 

173 SET1 

SET 

1,E 

149 

JR 

Z,SET2 

174 

JP 

VEZ 

150 

CP 

5 

175 SETO 

SET 

0, E 

151 

JR 

Z,SET3 

176 

JP 

VEZ 

152 

CP 

4 

177 SALVA 



153 

JR 

Z,SET4 

178 ;En las 8 direcciones sigu 

154 

CP 

"ÍT 

lentes a SALVA se 

guardan 

155 

JR 

Z,SETS 

179 ;los datos 

del LíDG que se 

156 

CP 

2 

esta rotando 


157 

JR 

Z,SET 6 





3 



















ROTACION DE 



1 

2 

3 

4 

S 

6 

7 

5 

3 

12 

£4 

32 

£3 

£2 

iL. 

m 

U 


13 

14 

13 

le 

—J 

í 

13 

£2 

21 

32 

£7 

i 2 


12 

¿jg 

£1 

g£ 

£3 

24 

uS 

14 

££ 

22 

23 

46 

£2 

£5 

£7 


£9 

23 

21 

3 fe 


12 

£1 

£2 

3 2 

£3 

33 

34 , 

35 

22 

37 

22 

29 

4* 


ü 

£a 

£2 

23 

44 

íU 

M 

£2 

44 . 


£2 

47 

4£ 

3 

Ü 

12 

£7 

23 

£2 

49 

50 


53 

£3 

§£ 


3S 


ia 

3 

£3 


££ 

52 

£3 

£3 

n 

50 

61 


£2 

fci 

1 

La 

d 

£3 


£1 


UDG ANTERIOR 




64, 

21 

22 

5J 

22 


U06 NUEUÜ 


RANDOMIZE U5R 60000 
(ROT 0 / 1 ) 


FIG. 3 

(Situación de los bits tras un ouarto de giro) 



UDG 

ORIGINAL 


l_t |_t I_ 1 

RANDOMIZE RANDOMIZE RANDOMIZE 
USR ©0000 USR 00000 USR ©0000 


ROTRCION DERECHA/IZOUIERDA 


III ■■■ 




III III 


om 

T) 

tu rm 

rnruxp 

)C—-- 



L Ji iu\ 

le: . 

"1 

..¿uRT m 





UDG 

ORIGINAL 


I_t í_t 1_ 1 

RANDOMIZE RANDOMIZE RANDOMIZE 
USR 60007 USR 60007 USR 60007 


ROTACION IZQUIERDA/DERECHA 



4 

(ROTACION COMPLETA RE UN UDG) 


guido el primer paso; el último bit 
de la primera fila se traslada al lugar 
del bit de la primera fila. 

Y el ciclo se repite 

Tras esta última operación, salta¬ 
mos incondicionalmente a la direc¬ 
ción etiquetada en VEZ donde in¬ 
crementábamos el registro IX (con 
esto accedemos ya al siguiente Byte, 
de cuál tendremos que comprobar 
su último bit). La siguiente instruc¬ 
ción (DJNZ BUC) hace que se de- 
cremente B en 1 y salte a BUC mien¬ 
tras su valor no sea cero. A partir de 
BUC volvemos a repetir la misma 
operación anterior, cargando en C 
el contenido de IX + O que ahora ya 
es el 2.° dato del UDG. 

Una vez que B sea igual a O, quie¬ 
re decir que hemos examiando el 
contenido de todos los últimos bits 
de las 8 filas y trasladado su conteni¬ 
do ai registro E. Bien, pues este re¬ 
gistro se carga en la dirección conte¬ 
nida en HL (línea 59) y que corres¬ 
ponde a la dirección inicial del 
UDG en esta primera parte de este 
complicado bucle. Volvemos a car¬ 
gar en IX la dirección etiquetada en 
SALVA, con lo cual se accede de 
nuevo al primer dato del UDG (aho¬ 
ra se trata de comprobar el estado de 
cada uno de los penúltimos bits de 
las 8 filas del UDG). Entre las líneas 
65 y 70, incrementamos HL para po¬ 
der escribir sobre la siguiente direc¬ 
ción del UDG; decrementamos el 
contador de las filas (registro D), 
iniciamos de nuevo el registro E a 0 
y si no hemos completado todas las 
filas, volvemos de nuevo a la etique¬ 
ta BYTE donde se reinicializa todo 
el proceso. 

Enrevesado. ¿No? A primera vista 
sí lo parece, pero puede llegar a en¬ 
tender totalmente el proceso si si¬ 
gue el programa paso a paso con un 
modelo de UDG como ejemplo. 
Entonces podrá ver que a pesar de 
su longitud, el programa es geniu- 
namente sencillo, ya que no hace 































































































































ROTACION 


QJJSXli 


más que poner en práctica los fun¬ 
damentos que explicamos en nues¬ 
tro apartado anterior, «Ideas básicas 
de la rotación». 

El programa de 
demostración BASIC 

Si no dispone de un ensamblador, 
debe hacer uso del programa BA¬ 
SIC que carga los códigos en la me¬ 
moria y que al mismo tiempo ofrece 
una demostración de lo que es ca¬ 
paz de hacer. 

Cuando desee utilizarla en un 


programa propio, deberá grabarla 
con SAVE “ROTAC10N”C0DE 
60000,309 y cargarla posteriormente 
(LOAD "’CODE). Después de ha¬ 
ber hecho lun CLEAR 56995, antes 
de llamar a la rutina, se debe cargar 
en la dirección 59999 en n.° de Or¬ 
den del gráfico a imprimir y poste¬ 
riormente RANDOMIZE USR 
60000 ó RANDOMIZE USR 60007 
según el sentido del giro que quiera 
dar al gráfico. Finalmente, imprima 
el gráfico. El método es similar al de 
laya estudiada inversión de caracte¬ 
res. 


Una mejora sustancial de la ruti¬ 
na consistiría en que rotara no sola¬ 
mente un gráfico, sino todo un blo¬ 
que de caracteres. Aquí ya no habría 
que cambiar exclusivamente los bits 
del carácter, sino también cambiar 
las direcciones de los gráficos que 
conforman el bloque. Sobre la base 
de lo que ya hemos visto y si tiene 
los suficientes conocimientos para 
ello, puede intentar afrontar este 
nuevo problema. 

Orlando Ara ujo Martin 


1 REM Orlando Araujo Martin 

2 REM Cargador ROTACION 

3 REM 13 Junio 1986 

4 

5 

50 PRINT FLASH 1;AT 10,10;"CA 
RGANDO CODIGO" 

ICO LET CON=C 

120 FOR 1=60000 TO 60309: READ 
A 

130 POKE I,A: LET CON=CON+A: NE 
XT I 

140 IF CQN< >32933 THEN PRINT 11 
ERROR EN DATAS": STOP 
150 REM DEMONSTRAS ION 
160 REM 
170 CLS 

200 LET C0N=144: FÜR 1=144 TO 1 
64: FOR N=0 TO 3: POKE 59999,144 
-CON: PRINT CHR* I;*' "; : R ANDON I 

2E USR 60000! NEXT N 
210 LET CDN»CDN-1: PRINT : NEXT 
I 

250 PRINT INVERSE 1;AT 21,0;"D 
ER./IZQ" 

300 LET X =0: LET Y=15: LET CÜN= 
144: FOR 1=144 TO 164: FOR N=0 T 
O 3: POKE 59999,144-CON: PRINT A 
T X,Y;CHR$ I: RANDOMIZE USR 6000 
7: LET Y=Y+2: NEXT N 
310 LET CON=CON-1: LET X=X+1: L 
ET Y=15: NEXT I 

350 PRINT INVERSE 1;AT 21,15;" 
IZQ./DER." 

1001 DATA 62,0,50,92,234,24,5,62 
,1,50,92,234,58,95,234,203,39,20 
3,39,203,39,95,22,0,42 


1002 DATA 123,92,25,34,93,234,1, 
8,0,42,93,234,17,145,235,237,176 

-r-jr 143 ^^3 "^4 17 h ^21 4^ 

1003 DATA 176,92,42,93,234,30,0, 
22,8,6,8,221,78,0,58,92,234,254, 
0,40,21,24,52,32,115 

1004 DATA 221,35,16,238,115,221, 
42,176,92,35,21,30,0,122,200,24, 
223,122,254,8,40,61,254,7,40 

1005 DATA 61,254,6,40,61,254,5,4 
0,61,254,4,40,61,254,3,40,61,254 
,2,40,61,254,1,40,61 

1006 DATA 122,254,8,40,56,254,7, 
40,48,254,6,40,40,254,5,40,32,25 
4,4,40,24,254,3,40,16 

1007 DAT A 254,2,40^ 8,254,1,40,0, 
203,65,24,167,203,73,24,163,203, 
81,24,159,203,89,24,155,203 

1008 DATA 97,24,151,203,105,24,1 
47,203,113,24,143,203,121,24,139 
,58,92,234,254,O,40,2,24,33,120 

1009 DATA 254,8,40,61,254,7,40,6 
2,254,6,40,63,254,5,40,64,254,4, 

40.65.254.3.40.66.254 

1010 DATA 2,40,67,254,1,40,68,12 
O,254,8,40,63,254,7,40,54,254,6, 

40.45.254.5.40.36.254 

1011 DATA 4,40,27,254,3,40,10,23 
4,2,40,9,254,1,40,0,203,251,195, 

171.234.203.243.195.171.234 

1012 DATA 203,235,195,171,234,20 
3,227,195,171,234,203,219,195,17 
1,234,203,211,195,171,234,203,20 

3.195.171.234 

1013 DATA 2*03,195,195,171,234,0, 
O, O, O, O 













PROGRAMA TU ORDENADOR PARA QUE 
JUEGUE COMO UN MAESTRO 



A unque las reglas y estrategias 
del juego de las 3 en raya son 
muy simples, conseguir que tu 
ordenador juegue bien no es dema¬ 
siado fácil. En este artículo enseña¬ 
remos a tu ordenador a jugar a ga¬ 
nar, o como mucho a empatar, 
Comparado con un jugador huma¬ 
no experimentado, la única debili¬ 
dad de este programa es su ocasio¬ 
nal pasividad; a veces se decidirá por 
un empate cuando es posible obte¬ 
ner una victoria. 

Además de enseñar a tu ordena¬ 
dor a jugar, el programa sirve como 
ejemplo de tres técnicas que son 
igualmente aplicables para desarro¬ 
llar programas de otros juegos más 
complejos, como el ajedrez o las da¬ 
mas: 

- Movimientos de apertura pre¬ 
parados. 

— «Echar un vistazo», valorar las 
consecuencias de un movi¬ 
miento, estudiando las posi¬ 
bles jugadas siguientes. 

- Heurística, seleccionar movi¬ 
mientos acordes con principios 
generales de estrategia. 

Reglas y Estrategias 

B Antes de explicar cómo funciona 
el programa, revisaremos el objeto, 


reglas y estrategias de este juego. Se 
juega en una rejilla de 3x3 casillas, 
Dosjugadores marcan una celda, al¬ 
ternativamente. El jugador que sale, 
marca con una X, y el otro con O. 
(Nos referimos a ellos de ahora en 
adelante, como jugador X y jugador 
O). 

El primer jugador que coloque 
tres marcas en una columna, fila o 
diagonal gana. Si todas las celdas es¬ 
tán llenas sin que haya ganado nin¬ 
gún jugador se produce un empate. 
Antes de empezar los subsiguientes 
juegos, ambos jugadores intercam¬ 
bian el orden de salida, así el prime¬ 
ro pasa a ser el segundo y viceversa. 
El nivel más bajo de estrategia en el 
juego se compone de tres pasos (1) 
si puedes ganar en tu siguiente tur¬ 
no, hazlo; (2) si tu oponente puede 
ganar en el suyo, bloquea su acción; 
(3) si no se dan ni (1), ni (2) ocupa 
otra casilla libre. 

No lleva mucho tiempo mejorar o 
refinar el paso (3). La buena estrate¬ 
gia está basada en la trampa, una 
marca que te da dos oportunidades 
de ganar en tu siguiente jugada (grᬠ
fico 1). Tu oponente sólo será capaz 
de bloquear una de estas posibilida¬ 
des y así cuando te toque jugar de 
nuevo, tendrás todavía una oportu¬ 
nidad de completar una raya. 

Recíprocamente, para evitar per- 

















LISTHDO 1 


55RAND0MIZE 

10 CLS : BOEE 33658,8 PAPER 7 INK 0 
30 Din JS( 2 , 8 >: DIM i<3,35.= Din 00,3 
Ai 9 , 3 5 ■ DIH Gi 2 5 = Din C*í 3, 1 5 DI 11 Vi 2 5 
35 LET VU>«*0‘ LET V<2 5*0 = LET JE* tí 
40 FOR F»1 TO 3 
50 FOR C=1 TO 3 
60 REAO T<F,C > 

70 NEXT C 
80 NEXT F 

30 DRTft 2, 3/2,3,1,3,2,3,2 

160 FOR N-l TO 4 
110 FOR V*1 TO 2 
120 RERD D< H , V > 

130 HEXT V 
140 HEXT N 

150 DRTA 0,1,1,1, 1,0,1, ~1 

160 FOR W=1 TO 8 

170 FOR Y-l TO 3 * 

130 READ fl< W, Y > 

130 HEXT Y 


FLfiSH 0 * INVERSE 0 BRIGHT 0 
Din T < 3,3 5 ! DIM Ji 2 5 ! DIM Di 4,2 



200 HEXT U 

210 DATA 1,1,1, 1, 1,2,1,1,3,1, 2 , 3,1 , 3 , 4 , 1 , 3 , 3 , 2 , 1 , 1 , 3 , 1 , 1 

230 LET C*< 1 >=■■-" 

240 LET C*<25-"X" 

250 LET C$< 3)="0" 

253 LET TES-0 

254 PRINT "SI QUIERES QUE EL ORDENADOR JUEGE SOLO, INTRODUCE •' ", INK 
CTRON” > INK 0, “ ‘ 11 

255 INPUT "CON QUIEN VOY fl JUGAR "i LIME S* 

256 IF LEN S*>8 THEN LET S**á«i 1 TO 8 5 

257 LET LAR-LEH 8 * 

258 IF S$="SPECTRON" THEN LET TE8=1. 

260 LET J*< 1 >«SÍ 


£70 LET J$C £ 5= " SFECTRUM " 

280 LET Vil 5*0 

290 LET V<2 5*0 

300 LET JE*0 

330 LET J< 15*1 

340 LET JC2>=2 

350 GÜ TO 398 


DIM 


2.5 "SPE 


LISTñDO 


36@>LET JS*J<1 5 
370 LET Jil5=J<2> 

380 LET Jí. 2 >=JS 

400 CLS ! PRINT ÑT 1,0; INK 7; PñPEP 1;" - 3 EN RAYA - 

405 PRINT RT 13,£;"SFECTRUM";RT 13,17-INT tLAR/2 >; Jíi15; AT 13,25; "EMPATES" 

406 PRINT RT 8,16,"FILR COLUMNA" 

407 PRINT RT 15,5; V< 25; AT 15,17; Vi 1 •>; AT 15,28 ; JE 
410 LET NM=6 

420 FOR F=1 TO 3 
430 FOR C=1 TO 3 
440 LET I<F,C>*0 
450 NEXT C 
460 NEXT F 








LISTADO 3 

470> LEI. NIT=Nt1+l 
480 LET NR-1 
430 LET R=1 
500 GO SUB 2020 

52© PRINT RT 5, 10 ;" JU EGA ■ ” ; INK -X NR >+íi J*< J< WR > ); INK 0;RT 5/25; "MRRCR "i INK 
J\ NR >+l;C$CNR+l > 

525 PRINT RT 10,1?.;" 

530 IF JÍNR>*1 THEN GQ SUB 820+188*<TES=1> 

535 IF ,K NR >~2 THEN GÜ SUB 1000 


LISTADO *4 

540> LET SL~3 

550 LET ST=NR 

560 GO SUB 2240 

580 IF H>0 THEN GÜ TO 640 

580 IF NM=6 THEN GÜ TÜ 730 

600 IF NM-5 THEN GO TO 630 

610 IF NR~£ THEN GO TO 470 

620 LET HR-NR+1 

630 GO TO 430 

640 LET P-GÍ H) 

650 GO SUB 2620 

660 PRINT FlT 18,2; FLASH 1; INK 7; PAPER 1; “GANA " ; JSK JC. NP > 1 TO 8-< J<NR)=1 

J ^ ; II | II 

670 ' LET V< J( NR ) >-V< J< NR > >+ 1 
680 GO TO 730 
630 LET R=1 
700 GO SUB 2028 

716 PRINT RT 13,2; FLASH 1 } PAPER 1; INK 7;"EMPATE" 

720 LET JE-JE+1 ‘ 


IM^spectrun 


í 




MADRID 

( 91)7339662 









LISTADO S 


730 > 

PRINT 

RT 

15,5; Vi 2 >; HT 

15,. 17; Vi 

1 >; 

RT 

15,28;. 

JE 

740 

INPUT 

"SEGUIMOS 0 LO 

DEJAMOS < 

SzTO " 

; LIME 


745 

F'RINT HT 

18.2;" 


II 




750 

IF Hí= 

: "3 

" QR H$="£" 

THEN GÜ 

TÜ 

360 



768 

IF H$< 

V II 

✓ 

D" HMD H$<>"d 

I" THEN 

GO 

TO 

740 


810 

STOP 









LISTADO e 

820>PRINT HT 21, 0.i "FILR Y COLUMNA-CO,. 6 > JUEGO NUEVO” 
830 INPUT "FILñ " í FM; ’’ COLUMNA " ■ CN 
835 F'RINT AT 21,0," 


848 

IF FM=0 RMD CM“0 TH 

EN 

GO TO 

950 



850 

IF ITK1 0| 

? FM>3 OE 

CM< 1 

QR CF' 

1: 3 THEN GÜ TÜ 89Ü 



860 

IF IvFM,Cr 

1 >=0 THEN 

GO 

TO 986 

\ 



87tf 

F'RINT #1; 

PAPER 1; 

INK 

. II 
l .■ 

CASILLA OCUPADA 

" i = PAUSE 

200 

880 

890 

GO TÜ 900 
PRINT #1; 

PAPER 1; 

ÍNK 

■"* . ii 

i y 

NO EMISTE ESA CELDA 

" .i PAUSE 

200 

910 

LET R=1 







920 

GO SUS 2021 

') 






94y 

GÜ TÜ 820 







950 

PRINT #1; 

PRPER I; 

INK 

? .¡ " 

JUEGO CANCELADO 

"; i PAUSE 

200 

960 

LET NM=6 ; 

ijQ Tu 590 






970 

RETURN 







980 

PRINT RT U 

;i, 18; FU; RT 

10, 

25,1 en 

LET I<FM,CM>«NR 



990 

RETURN 








der el juego, intentarás impedir que 
tu contrario te ponga una trampa 
(gráfico 1). Protegerte de las tram¬ 
pas no es siempre fácil. En algunos 
casos deberás evaluar las posibles 
jugadas de dos turnos sucesivos pa¬ 
ra desbaratar una posible encerro¬ 
na. Incluso, la primera marca del ju¬ 
gador O puede conducirle a un posi¬ 
ble fracaso. Las siete configuracio¬ 
nes que el jugador O debe evitar en 
su primer turno están en el gráfico 2. 
Antes de seguir leyendo, puedes 
comprobar por ti mismo que X pue¬ 
de ganar en cada una de esas situa¬ 
ciones. 

Cómo juega el ordenador 

En el siguiente párrafo, explicare¬ 
mos como el ordenador maneja am¬ 
bos papeles, jugador X y jugador C. 
Ocasionalmente, puede sonar como 
si el programa juega consigo mismo, 
pero debes tener en cuenta que en 
un real, tu representas un papel y la 
máquina otro. 

Las primeras marcas de ambos ju¬ 
gadores son tratadas como casos es¬ 


peciales. El programa usa movi¬ 
mientos preparados para estas juga¬ 
das, sin analizar las posiblesjugadas 
siguientes, ni utilizar métodos 
heurísticos. Para seleccionar las 
marcas de los turnos siguientes el 
programa utiliza cinco pruebas: 

1. Buscar potenciales jugadas 
para ganar, marcas que completen 
una raya. Sí encuentra varias, el pro¬ 
grama escoge aleatoriamente entre 
ellas. 

2. Si el programa no puede en¬ 
contrar una marca que le dé la victo¬ 
ria, comprueba si el oponente puede 
ser bloqueado para prevenir una 
victoria en su siguiente turno (se in¬ 
vestiga una jugada adelante). El pro¬ 
grama bloquea la primera de esas 
rayas que encuentra. 

3. Si el programa aún no ha 
marcado ninguna casilla, comienza 
a buscar celdas para poner una 
trampa al contrario, escogiendo la 
primera que encuentre. 

4. Si ninguna de estas compro¬ 
baciones ha resultado para marcar 
una casilla, el programa busca casi¬ 
llas donde prevenir una posible 
trampa del contrario en su siguiente 


turno. Esto implica estudiar las posi¬ 
bles marcas de las dos jugadas si¬ 
guientes, 

5. Para escoger entre las celdas 
que pasan la prueba 4, el programa 
selecciona la casilla que está en las 
menos rayas posibles, estas rayas no 
deben incluir ninguna de sus pro¬ 
pias marcas. La razón de esto, es que 
cuantas menos rayas haya sin mar¬ 
cas del jugador, menos posibilida¬ 
des tiene el oponente de ganar el 
juego. Sin embargo, este principio 
no siempre produce la estrategia 
más agresiva, por esto el programa, 
ocasionalmente se colocará para 
forzar un empate cuando es posible 
obtener una victoria. 


El programa 

Presentamos el programa en blo¬ 
ques lógicos. Tecléalos según va¬ 
mos avanzando en la explicación. El 
primer bloque inicializa el ordena¬ 
dor, crea varias matrices y asigna 
ciertos valores para algunas varia¬ 
bles generales del programa: 









ORDENADOR 

- POPULAR 


LA REVISTA QUE INTERESA TANTO AL AFICIONADO COMO AL PROFESIONAL 



Cómprela en su kiosco habitual o solicítela a: 


Ya está a la venta 


Una publicación que 
informa con amenidad 
acerca de las novedades 
en el campo de las 
computadoras personales. 


ORDENADOR POPULAR .; 
la revista para el 
aficionado a la 
informática. 


ORDENADOR 

- POPULAR 


BmwMurillo,377 
Te!.7339662 
mm-MADRii) . 
























LISTADO 1 


LISTADO 7 






1000 > 

IF NM>1THEN 

GO 

TO 

1210 



1010 

IF NROl THEN 

GÜ 

TO 1060 



1020 

GO SUB 2620 






1030 

LET FH-FT 






1040 

LET CPNCT 






1050 

GÜ T0 133Ó 






1060 

LET T=TÍ FÍ'L 

en > 





1070 

G0 SUB 2620 






1080 

IF T=1 THEN 

GO 

TO 

1 030 



1081 

IF T-2 THEN 

GO 

T0 

me 



1032 

IF T“3 THEN 

G0 

TÜ 

1140 



1030 

IF KFT,CT> 

-3 THEN 

GO TÜ 

107 

1100 

G0 TO 1180 






1110 

LET FT~2 






1120 

LET CT~2 






1130 , 

GÜ TO 1180 






1140 

IF I ( FT t CT >= 

1 THEN 

GÜ TÜ 

11 

80 

1141 

IF I(FT..CT>= 

2 THEN 

GO TO 

11 

50 

1142 

IF KFT, CT >~ 

3 THEN 

GO TO 

11 

7ñ 

1145 

LET W-FT-FM ; 

LET 

y= 

CT-CM 



1150 

IF RBS W-2 OR RB 

S V 

=1 THEN 


GÜ 

1160 

GO I0 1180 






1165 

LET W-FT-Fr-U 

LET 

Y= 

CT-CM 



1170 

IF RBS W=1 

OR RBS 

Y*1 THEN 

lj| 

1180 

LET FM-FT 






113G 

LET CM=CT 






1200 

GO TO 1330 









1070 

1070 


LISTADO & 

1210 > IF NM>2TMEN GO TO 1240 

1220 IF NR-2 THEN GO TO 1340 

1230 GO TO 1500 

1240 LET ST-NR 

1250 LET 3L“2 

1260 GO SUB 2240 

1270 IF N«0 THEN GO TO 1340 

1280 LET M=1NT í H4:RHD >+l 

1230 LET R=G<M > 

1300 GO SUB 2480 
1310 LET FM-FÜ 
1320 LEÍ CM=Cü 
1330 GÜ TO 1330 


L_ I: 

BTñD O S* 

1340; 

LET 

ST-3-NR 

1350 

LET 

SL-2 

1360 

GÜ S 

UB 2240 

1370 

IF 

N—0 THEN GO T0 1430 

1380 

LET 

R-GCN ) 

1330 

GO 

SUB 2480 

1400 

LET 

FM=FÜ 

1410 

LET 

en “Cu 

1420 

GO 

TO 1330 


La matriz I (fila, columna) contie¬ 
ne una imagen del tablero de juego. 
Las líneas 40 a 90 leen los tres tipos 
de casillas y los guardan en T(,), 1= 
centro, 2=esquina, 3=lado. Las 
líneas 100 a 150 leen en D{,) los vec¬ 
tores de dirección usados para gene¬ 
rar las ocho posibles rayas que hay 
en el juego (gráfico 3). Para la raya 
R, D(R, l) es el incremento en filas y 
D(R,2) el incremento en columnas. 

Las líneas 160 a 210 leen en A(,) 
los atributos de las ocho rayas. Para 
la raya R, A(R, 1) es la fila de salida y 
A(R,2) es la columna, A(R,3) es la 
dirección que sigue. 

C$() almacena los caracteres usa¬ 
dos cuando se representa la rejilla: 
«—» para celda libre, «X» y «O». J$() 
guarda el nombre de cada jugador, 
J$(2) es siempre «SPECTRUM». 
«VC» contiene eí número de victo¬ 
rias de cadajugador y JE el de juegos 
empatados, las tres son inicializadas 
a cero. 

En la línea 254 está la rutina de in¬ 
troducción del nombre de) jugador 
humano, si este nombre contiene 
más de 8 caracteres es truncado para 
que pueda almacenarse en J$(). En 
las líneas 330 y 340 se determinan 
cuáles son los jagadores para el pri¬ 
mer enfrentamiento. J(N)=1 indica 
que el jugador N es humano y J(N)= 
2 que es el ordenador. 

El siguiente bloque de líneas se 
encarga de iniciar un nuevo juego: 

LISTADO 2 

Las líneas 360 a 380 hacen que los 
jugadores intercambien sus órdenes 
de salida cuando se inicia un nuevo 
juego (la línea 350 mantiene el or¬ 
den para el primer juego). NM es el 
número de movimiento, inicial¬ 
mente a 0. Un movimiento comple¬ 
to consiste en 2 marcas, una X y un 
0. Las líneas 420 a 460 vacían la reji¬ 
lla para un nuevo juego. Ahora el 
programa está preparado para la pri¬ 
mera marca: 

LISTADO 3 

Primero el contador de movi¬ 
mientos es incrementado y el nú¬ 
mero de jugadas es 1 (líneas 470 a 
480). La subrutina llamada en 500 





LISTHDP 16 

Í430> 1F NF1*£TH£H GO Tü 1566 

1446 LET ST=NR 

1450 GO SUB £666 

1460 1F N<>2 THEN G0 TO 1500 

1476 LET FM-FV 

1488 * LET CM*CV 

1496 GO TO 1996 

LISTRDO 11 

1560> LET FS=0 
1510 FOR F-l TO 3 
1526 FOR OI TO 3 

1530 1F I(F,CX>0 THEN GO TO 1760 

1540 LET KF,C>=NR 

1550 LET 3T”NR 

1560 LET SL=2 

1570 GO SUB £240 

1580 IF N»0 THEN GO TÜ 1680 

1590 IF NH-2 AND HP=1 THEN GO TO 1720 

1600 LET R-GÍ 1 

1610 GO SUB £486 

1620 LET ST-3-NR 

1630 LET IíFÜ,CCD~ST 

1640 LET SL-2 

1650 GO SUB 2£40 

1660 LET KFO,CO>*0 

1670 GO TU 1718 

1680 IF NM“£ RND NR*1 THEN GO TO 1750 

1690 LET ST-3-NR 

1700 GO SUB £660 

1710 IF N=2 THEN GO TO 1,750 

1720 LET FS-FS+l 

1730 LET Oí FSj> 1 )—F 

1740 LET ÜÍFS,£XC 

1750 LET I(F,C>=0 

1760 NEXT C 

1770 NEXT F 

L. X 5 T R D O X S2 

1780 > LET SL“£ 

1790 LET ST“3-HR 

1800 FOR C~1 Tü F 

1810 LEÍ IÍ Oí C, 1 >, Oí C, 2 >>=NR 

1820 GO SUB 2240 

1830 LET I í Oí C .'IX Oí C f 2 > )~Q 

1840 LET Oí C.. 3 >”M 

1850 NEXT C 

1860 IF F$<>1 THEN GO TO 1890 
1870 LET CN"1 
1890 LET SM=1 
1900 FOR U-2 TO FS 

1910 IF OíSN,3X0ÍW,3> THEN GO TO 1930 
1920 LET SM=W 
1930 NEXT U 

1948 LET CN-INT ÍFS*RND>+1 

1950 IF Oí CH.' 3 >=0< SMí 3 > THEN GO TO 1970 

1960 GO TO 1940 

1970 LET FN=OÍCN, 1 ;■ 

1980 LET CM-OÍCN,2 ) 


imprime la rejilla de juego en el es¬ 
tado actual y la 520 indica de quién 
es el turno de jugar. Dependiendo 
del jugador que debe marcar, las 
líneas 530 y 535 llaman a una u otra 
subrutina. La de la línea 820 es para 
recibir desde teclado la elección de 
casilla del jugador humano, y la de 
la línea 1000 para que el programa 
siguiendo su lógica, seleccione una 
celda. Después de realizar la selec¬ 
ción el programa evalúa su efecto: 

LISTADO 4 

La subrutina llamada en 560 bus¬ 
ca en las ocho rayas para ver si el ju¬ 
gador actual ha ganado. N>0 indica 
que ha ganado, en ese caso las líneas 
640 a 680 anuncian el nombre del ju¬ 
gador e incrementan su contador de 
victorias. Si N=0, el ordenador com¬ 
prueba el número de movimientos 
NM para ver si el juego ha termina¬ 
do de alguna otra manera. Hay sólo 

9 casidas en la rejilla, y cada movi¬ 
miento representa ocupar dos de és¬ 
tas, una para cada jugador. Ordina¬ 
riamente, NM no puede exceder 
nunca de 5, porque la X del movi¬ 
miento número 5 siempre ocupa la 
novena casilla (2+2+2+2+1=9 casi¬ 
llas). Sin embargo, si un jugador 
cancela el juego, NM de carga con 6. 
La línea 590 detecta esa condición y 
salta al menú de continuación. 

Cuando NM=5, el ordenador de¬ 
duce un empate (no hay ganador y 
todas las celdas están marcadas), y 

10 anuncia (líneas 690 a 720). En 
otro caso NM es menor que 5, así el 
programa da el turno al siguiente ju¬ 
gador. 

Las líneas siguientes imprimen el 
menú de continuación al final del 
juego: 

LSITADO 5 

Se imprimen los contadores de 
victorias y de empates y se pregunta, 
si se quiere terminar o seguir jugan¬ 
do. Este es el final del programa 
principal. Ahora presentaremos las 
dos rutinas más grandes, el turno 
del humano y el turno del ordena¬ 
dor. 

Submtinas 


El programa llama a la siguiente 





L_ I STRDO 13 


1990> LET I< FM, CM >=NR 

2006 PRINT FHT 10,18jFMíAT 10i25iCt1 

2010 RETURN 


L. I STRDO 1 


2020> LET QF*fi<R/l) 

2030 LET GC-FK R:2 '? 

£040 LET DN=FKR,3> 

2050 LET QL-0 

2070 F0R U=l TO 3 

2080 PRINT FlT 5+< U-l )#£, 1 .; " " 

£090 FOR V-l TO 3 

2100 IF QL--3 OR WOQF OR VOQC THEN 
GO TO 2180 

2120 PRINT C«I(W,Y>+l)i 
2140 LET QF-GSF+DÍDN,1 ) 

2150 LET QC=QC+[XDN,2> 

2160 LET QL=QL+1 

£170 LO TO 2190 

2130 PRINT C3K KU/O+1 X; 

2190 PRINT " 

£200 NEXT Y 
2220 NEXT U 
£230 RETURN 


LISTADO 15 


2240> LET N”0 
£250 LET n~0 
2260 FOR R~1 TO 8 
2270 LET FU-fi<R,l> 

2280 LET CU-R(R,2) 

2290 LET DN«FKR,3 > 

2300 LET NF=0 
2310 LET MF*S 
2320 FOR 2=1 TO 3 

2330 1F I< FIO CU >“0 THEN GO TO 2380 

2340 IF I<FU,CU>«ST THEN GO TO £370 

2350 LET MF=MF+1 

2360 GO TO 2380 

2379 LET NF-NF+1 

£380 LET FU=FÜ+D« DN, 1> 

2390 LET CU-CU+LX DN, £ > 

2400 NEXT 2 

2410 IF NFOSL OR MF>@ THEN GO TO 2440 

2420 LET N=N+1 

2430 LET G<N >*R 

2440 IF MF>0 THEN GO TO £460 

2450 LET 11=11+1 
2460 NEXT R 
2470 RETURN 


subrutina cuando es el turno del ju¬ 
gador humano: 

LISTADO 6 

Las líneas 820 a 830 inquieren al 
jugador para que especifique la fila y 
columna de la celda a marcar. Las fi¬ 
las están numeradas de arriba a aba¬ 
jo y las columnas de izquierda a de¬ 
recha. Si el jugador selecciona 0,0, 
el juego es cancelado. Cualquier 
otro par fila-columna inválido detie¬ 
ne el programa y pregunta de nuevo 
al jugador su elección (870-940). 

Dado un par tila-columna válido, 
la línea 860 determina si la celda es¬ 
tá vacía, I(FM,CM)=0. Si la celda 
está vacía la línea 980 imprime la op¬ 
ción y la marca en la matriz imagen. 
La línea 990 retorna al programa 
principal. 

Cuando es el turno del ordena¬ 
dor, el programa llama a la rutina en 
la línea 1000. El programa usa movi¬ 
mientos preparados para la primera 
Xy el primerO. La primera X es una 
elección aleatoria, y el primero 0 es¬ 
tá determinado por la posición de la 
X anterior. Para los movimientos si¬ 
guientes, el ordenador usa la lógica 
de evaluar los posibles movimientos 
sucesivos. 

Las siguientes líneas manejan las 
primeras X y O del ordenador: 

LISTADO 7 

Sí el número de movimiento NM 
es mayor que 1, la línea 1000 hace 
que el programa salte a las rutinas 
de investigación de posiblesjugadas 
sucesivas que serán descritas más 
adelante. Si NM—l y NR=], el pro¬ 
grama hace la primera marca, una 
X. La subrutina llamada en la línea 
1020 selecciona una celda aleatoria¬ 
mente, y las líneas 1030 y 1040 guar¬ 
dan la situación de dicha casilla en 
las variables FM y CM, La línea 
1050 provoca un salto al final de la 
subrutina que maneja el turno del 
ordenador. 

Las líneas 1060 a 1200 actúan 
cuando el ordenador es el jugador O 
y el número de movimiento es 1; de¬ 
ben encontrar una celda que evite 
las siete posiciones de pérdida del 
juego. En la línea 1060, las variables 
FM y CM contienen la fila y colum¬ 
na del movimiento más reciente; en 











otras palabras, informan al progra¬ 
ma cuál celda contiene la X. La línea 
1060 determina en qué tipo de casi¬ 
lla está la X: centro, esquina o late¬ 
ral. 

La subrutina llamada en la línea 
1070 selecciona ai azar una celda va¬ 
cía T(FT,CT) como candidata para 
el siguiente movimiento del jugador 
O. Las 1080, 1081, 1082 saltan a la 
comprobación de seguridad apro¬ 
piada, dependiendo del tipo de cel¬ 
da que está marcada con X. 

Una vez que el programa ha loca¬ 
lizado una celda segura, las lineas 
1180 y 1190 guardan su dirección de 
fila y columna, y la línea 1200 salta al 
final de la subrutina del turno del or¬ 
denador. 

En el caso del segundo movi¬ 
miento y los siguientes, el programa 
no usará movimientos preparados. 
Primero comprobará sí puede ganar 
con una marca: 

LISTADO 8 

Para los números de movimiento, 
NM, iguales o mayores que 3, las 
líneas 1240a 1330buscan una casilla 
que de la victoria. La subrutina lla¬ 
mada en la línea 1260 cuenta el nú¬ 
mero de rayas no bloqueadas que 
contengan al menos 2 marcas dle ju¬ 
gador NR. Si N=0, no hay tales 
rayas, así el programa salta a la ruti¬ 
na del movimiento defensivo. 

Si N>0, entonces la matriz G() 
lista las rayas que contienen celdas 
ganadoras. La línea 1280 selecciona 
aleatoriamente una de estas rayas, y 
la subrutina llamada en la línea 1300 
encuentra la fila y columna de la cel¬ 
da libre en esa raya. En la linea 1280 
se genera un número aleatorio entre 
1 y N. 

Cuando el programa localiza una 
celda para ganar, las líneas 1310 y 
1320 almacenan su número de fila y 
de columna y la línea 1330 salta al fi¬ 
nal de la subrutina. Si el programa 
no puede encontrar una celda gana¬ 
dora, comprueba si puede impedir 
que su oponente gane en su siguien¬ 
te turno: 

LISTADO 9 

La línea 1340 sitúa en ST el nú¬ 
mero del jugador contrario. La su¬ 
brutina llamada en 1360 cuenta el 


número de rayas no bloqueadas que 
contienen al menos 2 marcas del ju¬ 
gador contrario. Si N=0, no hay 
rayas de ese tipo, y el programa salta 
a la rutina de colocación de trampas. 
Si N no es 0, entonces hay al menos 
una posibilidad de que el contrario 
gane en su siguiente marca. Las 
líneas 1380 y 1390 encuentran la cel¬ 
da ganadora del oponente y las 
líneas 1400 y 1410 almacenan la di¬ 
rección de su fila y su columna, y así 
el ordenador puede ocuparla. La 
línea 1420 salta al final de la rutina 
del turno de la máquina. 

LISTADO 10 

La subrutina de la línea 2660 com¬ 
prueba cada casilla vacía para ver 
cuál, si hay alguna, produce una 
trampa. Si N=2, el programa ha en¬ 
contrado una celda, y las líneas 1470 
y 1480 guardarán su número de fila y 
columna para que el ordenador la 
utilice. La línea 1490 salla al final de 
la subrutina del turno del ordena¬ 
dor. 

Si no se encuentran oportunida¬ 
des de colocar una trampa, el pro¬ 
grama comprobará cada celda vacia 
para ver cuál impediría al contrario 
colocar una trampa en su siguiente 
marca. Esta es la evaluación de posi¬ 
bles jugadas futuras de más alcance 
que realiza el programa: 

LISTADO 11 

La variable FS cuenta el número 
de celdas seguras (aquellas que im¬ 
piden al oponente poner una tram¬ 
pa). En las líneas 1730 y 1740, para 
cada celda segura FS que es encon¬ 
trada, 0(FS,1) y 0(FS,2) guardan su 
número de fila y columna. Una vez 
que el programa ha localizado todas 
las celdas seguras, aplica el método 
heurístico para escoger entre ellas: 

LISTADO 12 

El programa marca cada celda se¬ 
gura (línea 1810) y entonces cuenta 
cuántas rayas M no bloqueadas que¬ 
dan. Para cada celda segura FS, 
P(FS,3) guarda el número de rayas 
no bloqueadas que quedan cuando 
la celda es marcada. 

Las líneas 1900 a 1930 comparan 
los resultados de estas marcas de 


prueba para ver cuáles de éstas están 
en el menor número posible (SM) 
de rayas no bloqueadas. En las 
líneas 1940 a 1960 el programa esco¬ 
ge aleatoriamente celdas seguras 
hasta que encuentra una que deje 
SM rayas no bloqueadas. En la linea 
1940 se genera un número entre 1 y 
FS. 

Las siguientes líneas finalizan la 
subrutina que controla el turno del 
ordenador: 

LISTADO 13 

La línea 1990 marca el número de 
jugador NR en la posición de rejilla 
I(FM,CM). La línea 2000 anuncia el 
movimiento, y la línea 2010 devuel¬ 
ve el control al programa principal. 

Rutina de impresión y 
auxiliares 

Aquí está la rutina que imprime el 
tablero de juego: 

LISTADO 14 

La línea 2080 controla la línea de 
impresión, la columna se controla 
imprimiendo espacios (línea 2190). 

Las rutinas auxiliares son reque¬ 
ridas en ciertas secciones del pro¬ 
grama para realizar funciones meno¬ 
res. Esta primera subrutina analiza 
el contenido de las seis rayas posi¬ 
bles: 

LISTADO 15 

Al volver de esta subrutina, la ma¬ 
triz G() lista los números de las N 
rayas no bloqueadas que contengan 
al menos SL marcas del jugador ST. 
La variable N cuenta el número de 
rayas no bloqueadas que contienen 
al menos SL marcas deljugador ST. 
La variable M cuenta el número de 
rayas que no contienen ninguna 
marca del otro jugador. 

La rutina que viene a continua¬ 
ción localiza la primera marca en la 
raya R: 

LISTADO 16 

De vuelta, FO es la fila de la raya 
abierta y CO la columna. La siguien¬ 
te se encarga de seleccionar una ca¬ 
silla vacía: 


LISTADO 17 


I 


1— I S 1 f 

i C* O 

1 & 

2660'.: 

■ FQR 

W~ i TO 


2676 

FOP 

Y= 1 TO 

3 

2680 

IF I 

( 14.. Y X 

0 THEN GO TO 

2698 

LEI 

8L=2 


2780 

LET 

K 14, Y 

)=8T 

2718 

60 

SUB 22' 

40 

2720 

LET 

KM, Y 

>:-0 

2730 

IF ! 

N<2 THEN GO TO 2730 

2740 

LET 

FV=N 


2750 

LET 

CV=Y 


2766 

LET 

14=3 


2770 

LET 

Y--3 


2780 

NEN 

T Y" 


2798 

NEXT 

M 


2800 

RETURN 



L„ I STMDO i 7 


2620> LET FT-INT < 3TRND >+1 
2630 LET CT-INT <3*RND)+1 

2640 IF I(FT■CT >< >0 THEN LO 7 0 2620 
2650 RETURN 


LIST ROO 1«S 


2480> LET FO-0 
2490 LET CO~0 
2500 LET FT~ñ< R .• 1 > 

2510 LET CT=ñ< R, 2 > 

2520 LET DN“ñ(R > 3> 

2538 FQR 14=1 TO 3 

2548 IF KFT/CTK>0 THEN GG TO 2588 

2558 LET FO-FT 

2568 LET CO-CT 

2570 LET 14=3 

2580 LET FT=FT+D< OH >1> 

2598 LET CT=CT+D< ON, 2 > 

2600 NEXT W 
2618 RETURN 


En las líneas 2620 y 2630 se obtie¬ 
nen el número de fila y columna 
aleatoriamente. En el retorno, la fila 
se guarda en FT y la columna en CT. 
Por último, presentamos la subruti¬ 
na que busca la oportunidad de co¬ 
locar una trampa: 


LISTADO 18 

Al principio de la subrutina, ST es 
el número de jugador que intenta 
colocar la trampa. Al final, N=2 in¬ 
dica que se ha encontrado u na tram¬ 
pa y, FV y CV almacenan el número 
de fila y columna de la celda donde 
se va a colocar. 


Retoques 


Puedes conseguir que la máquina 
juege consigo misma si en la peti¬ 
ción de nombre introduces “SPEC- 
TRON”. En ese caso, un testigo 
(TES) se ponee a 1 en la línea 530 
que provoca el salto a la rutina de 
petición de celda para el jugador hu¬ 
mano, se fuerza con una condición 
lógica el salto a la rutina de tumo del 
ordenador, sólo que ahora el núme¬ 
ro de jugador es 1 y la lógica del pro¬ 
grama opera con las otras fichas si¬ 
guiendo la misma estrategia descri¬ 
ta al principio del artículo. 

Después de jugar contra la mᬠ
quina puedes encontrar frustrante 
que el ordenador nunca pierda. Si 
juegas tan bien como él, cada juego 
acabará en empate. Para hacerlo 
más excitante, puedes simplificar la 
estrategia del ordenador de varias 
maneras. Primero, puedes eliminar 
los movimientos preparados para el 
primer O, saltando esa sección del 
logical. Por ejemplo: 

1010 REM ANTES HABIA: IF 
NRol THEN GOTO 1060 


Después de hacer este cambio, 
observarás que a menudo, el orde- 







X CENTER, X SIDE, 

O ANY SIDE: O FAR CORNER: 



Las siete posiciones de fracaso para el jugador O en su primera marca. 


Path 1: Path 2: X SIDE, X CORNER, 



El jugador O puede evitar la trampa marcando cualquiera de las dos casillas 
seguras indicadas con asterisco. 


nador mueve a las posiciones de 
perdición del gráfico 2. Puedes tam¬ 
bién eliminar la posibilidad de que 
el ordenador ponga o detecte tram¬ 
pas mediante: 


1500 GOTO 1020: REM ANTES 
HABIA: LET FS=0 
Después de hacer este cambio, el 
ordenador jugará al nivel más bajo 
de estrategia, comentado en el pᬠ


rrafo “COMO JUEGA EL ORDE¬ 
NADOR”. Incluso en este nivel la 
máquina puede sorprenderte reali¬ 
zando un brillante movimiento 
aleatorio. 












PROGRAMAS 






















PROGRAMAS 










CRAPS 


Basado en el juego de dados «Craps», el programa que nos ha enviado desde 
Valencia José‘Gallego muestra en todo momento información sobre 
la cantidad apostada, el dinero de que se dispone y el récord de ganancias. 

Incluye unas-completas instrucciones, aunque su manejo no es nada 
complicado, ya que sólo hay que responder a las preguntas que efectúa el 
ordenador. Las lineas 5 y 6 permiten utilizar un juego de caracteres diferente 
al del Spectrum, situado a partir de la dirección 64250. Por consiguiente, si 
no se va a emplear un juego de caracteres alternativo, es necesario 

eliminarlas. 


i REM 


CRAPS 


JUEGO DE DADOS 


44 

PRINT 

AT 

II 

11,4; 

46 

PAUSE 

5 


48 

PRINT 

AT 

12,4; 


2 REM 

3 REM JOSE GALLEGO GONZALEZ 

VALENCIA-ABRIL 1986 

4 REM 

5 LOAD 11 chars*'CODE 64250,768 

6 POKE 23606,250: PQKE 23607, 

249 

8 CLS : PRINT FLASH 1; AT 11, 
10; "PARA L.A CINTA" 

10 GQ SUB 9000 

15 POKE 2365B,8: LET di-lOOí L 
ET rc=Ü; LET "*-*■*•**■#•" 

20 REM PRESENTACION 

21 BQRDER 4: PAPER 4: INK O: C 

L3 

24 FÜR >:=7 TQ O STEP -1 
30 INK X 

32 PRINT AT 8,4;" 

ll 

34 PAUSE 5 
36 PRINT AT 9,4;" 

II 

38 PAUSE 5 
40 PRINT AT 10,4;" 

II 

42 PAUSE 5 


50 PAUSE 5 
52 NEXT x 


55 PRINT PAPER 7; 

INK 0;AT 

T 

5;“AB";AT 4,5;"CD" 

58 FÜR >: = 1 TO 10Os 

NEXT x 


60 PRINT PAPER 7; 

INK 0;AT 

1 , 

15; "EE" ; AT 2,15; II EE" 

62 FÜR x = l TO 100: 

NEXT x 


65 PRINT PAPER 7; 

INK 0:AT 

3, 

25;"FB";AT 4,25;"CG" 

67 FÜR x-1 TÜ 100s 

NEXT x 


70 PRINT PAPER 7; 

INK 0;AT 

16 

,28;"FH";AT 17,28;"! 

G" 


72 FOR >; = 1 TO 100: 

NEXT x 


75 PRINT PAPER 7; 

INK 0;AT 

16 

,15;"E ";AT 17,15;" 

E 11 


77 FQR x = 1 TO 100: 

NEXT x 


80 PRINT PAPER 7; 

INK 0;AT 

16 

,2; " J J 11 ; AT 17,2; "KK" 

88 FOR x = 1 TQ 100: 

NEXT x 


90 FOR 1=0 TO 250 


92 POKE 23606,1 
94 PRINT #1:AT 1,7; JOSE GAL 
LEGO 1986" 

96 NEXT I 

98 FOR x = l TO 500; NEXT >: 













PROGRAMAS 



100 REM INSTRUCCIONES 
105 CLS 

110 FRINT AT 1,7;“* INSTRUCCION 
ES *" 

115 PRINT AT 3,0;" El juega con 
siste en lanzar losdados y jugar 
contra la banca-" 

120 PRINT AT 6,0;" Si sale 7 o 
11 a la primera ti—rada, se gana 
la misma cantidadde lo apostad 
a. " 

125 PRINT AT' 10,0;" Si sale un 
2, 3 o 12 a la pri- mera, se pi 
srde- " 

130 PRINT AT 13,0; " Cua 1 qui er 
otra puntuación, secanvierte en 
TU PUNTO. Si s:l guestirando y re 
pites tu punto, ga-nas el dable 
de lo apostado,perasi sale 7, p 
ierdes." 

135 P ñ XNT #0;AT 1,0;"PULSA PARA 
EMPEZAR" 

140 PAUSE 0 
145 RANDDMIZE 
150 LET di=1005 CLS 
155 ÍNPUT #1 ; AT 1,0;"'Tu nombre 
? (man.6 1etras> " ; LIME a$ 

160 IF LEIM a$<1 GR LEN a*>6 THE 
N G0 T0 155 
200 REM JUEGO 

202 LET ap=0s LET ti=0s LET tp“ 

0 

205 CLS 

210 PRINT IÑK 0;"DIÑERO 11 ;TAB í 
9);"APUESTA";ThB (21); FLASH 0;" 
RECORD" 

215 PR 1 NT INK O; TAB (1) ; di ; TAB 
(ll);ap;TAB (19);ni;TAB (27);re 
225 INPIJT # 1; AT 1,0; " * Cuanto ap 
cestas? (min. 10) " ;ap 
227 IF ap<10 GR INI apOap THEN 
GÜ TO 225 

230 IF ap<=di THEN GG TG 240 
235 PRINT #1;AT 1,0;" ©NO TI 
ENES TANTO DI ÑERO *": BEEP 1,-10: 
POR a -1 TO 200: NEXT : GÜ TO 2 

25 

240 LET di=d:i. -ap: INPUT 0 
245 PRINT INK 0;AT 1,1;" 

11 ; AT 1 , 1 ( di ; AT 1,10; " " ; AT 


1 , .!. 1 , p 

247 PRINT #1;AT 1,8;"PULSA PARA 
TIRAR 11 s IF I NK£Y*= " " THEN GG T 

0 247 

248 PAUSE Os INPUT Os PAUSE 10 

250 PRINT AT 7,12;" ";AT 8,12; 

" ";AT 5,16s" ";AT 6,16;" " 

252 POR n=5 + (RND*15) TO 0 STEP 

-1 

253 BEEP .005,10 

254 PAUSE 6: NEXT n 

256 PRINT AT 7,12;" ";AT 8,12; 

" " ; AT 5,16;" ";AT 6,16; " " 

258 LET c1=0: LET c2=0; LET xl= 
19: LET x 2=17: LET 11=0: LET t2= 
0: LET ti=ti+l: LET re=0 
260 IF c1=7 AMD c2=7 THEN GG T 
O 280 

270 PRINT AT x 1 , 12 ;" ";AT xl + i 

,12;" ";AT x2,16;" ";AT x2+1,1 

6 ; " " 

280 LET a 1=0: LET á2=¡0 
290 IF C1 >'= 1 THEN LET xl=xl-2 
300 IF c2>=l THEN LET :<2=x2-2 
305 IF c1>=7 AND c2>=7 THEN GÜ 
TÜ 600 


310 

LET 

a=I NT (RND+6+1) 

320 

LET 

b=INT (RND+6+1) 

330 

LET 

ci=cl+is LET c 

2=c2+l 

340 

LET 

al=a*100+900 


350 

IF 

el07 THEN 60 

SUB al 

360 

LET 

tl=t1+2 


370 

LET 

a2=b*100+1900 


580 

IF 

c2<==7 THEN GO 

SUB a2 

590 

LET 

t2=t2+2 


595 

GG 

TO 260 


600 

REM 

RESULTADO TIRADA 

602 

LET 

re=a+b 


605 

IF 

re=2 THEN LET 

r O" DOS " 

606 

IF 

re=3 THEN LET 

r$="TRES" 

607 

1 1 

IF 

re=4 THEN LET 

rT="(IUATR 

608 

IF 

re-5 THEN LET 

r:f=" CINCO 

609 

IF 

re=6 THEN LET 

rO"SEIS" 

610 

IF 

re=8 THEN LET 

ri--:" OCHO" 

611 

IF 

re =9 THEN LET 

ri=" IMUEOE 

612 

IF 

re=10 THEN LET 

' rO"DIEZ 


& 











PROGRAMAS 


613 IF 

il 

re= 1.1 

THEN LET rí=" 

ONCE 

614 IF 

li 

r e= 12 

THEN LET rí®" 

DOCE 

615 IF 

re=tp 

AND ti>1 THEN 

GO 

TO 800 




620 IF 

(re—7 

OR re=ll) AND 

t i < - 

1 THEN 

GÜ TO 

700 


630 ÍF 

(re—2 

OR re—3 GR re= 

12) 


AND ti<=i THEN 60 Tü 730 
640 IF <re=4 0R re==5 OR ra=¿ OR 
re=8 QR re=9 OR re=lO) AND ti<= 
1 THEN 60 TÜ 760 
650 IF re=7 AND ti>1 THEN GO T 
Ü 730 

660 IF re<>tp AMD ti>1 THEN GO 
TO 830 

700 REM PREMIO 

701 IF re-7 THEN LET r$="@SIET 
E! " 

702 IF re* 11 THEN LET r$="@QNC 


E ! " 

705 BEEP 0.5,20 

710 PRI NT I Nl< O; AT i 4,13; r $; AT 
16,10; " HAS GANADO " ; ap : LET d i *= 
di -i-ap -*2 

715 IF di>100 AND di>rc THEN L 
ET rc=di s LET r.$=aí: PRINT AT 1, 
19;¡ " " s PRINT INK 0:¡AT 1,1 

9;ni;AT 1,27;re: PRINT INK O; F 
LASH 1;AT O,21;"RECORD 1 ' 

720 FOR X = 1 TÜ 300 : NEXT GO 
SUB 3000 
725 GO TÜ 200 

730 IF re=2 THEN LET rf="DÜS" 

731 IF re—3 THEN LET rí-="TRES " 

732 IF re® 12 THEN LET r:f-"DÜCE 

II 

733 IF re=7 THEN LET r$="SIETE 

íl 

735 BEEP O «5,-10 

740 PR INT I NK O 5 AT 14,13; r $; AT 


DISPONEMOS DE TAPAS ESPECIALES PARA 

SUS EJEMPLARES DE 


(cada tapa as para 6 ejemplares) 



Mospectnm 


SIN NECESIDAD DE ENCUADERNACION 

UNIDAD 


PRECIO 

fcS O P*g; 


Para hacer su pedido, rellene este cupón HOY MISMO 
y envíelo a: 

Bravo Muidlo, 377 

lOHwSpVdrUII Tel. 733 96 62 - 28020 MADRID 

— 

Por favor envíenme .. tapas para Ja encuadernación de mis 

ejemplares de TÜDÜSPECTRUM. al preíMO dé 650 pt$. más gastos de envío. 
El importe lo abonaré 

□ POR CHEQUE □ CONTRA REEMBOLSO □ CON MI TARJETA DE 
CREDITO □ AMERICAN EXPRESS" O VISA □ INTERBANK 

Número de mi tárjela; f[ 1 I i I [‘ i II 1 1 1 i L I I I I] ti El I U 

Fecha de caducidad .„. Firma 


NOMBRE . 
DIRECCION 


CIUDAD 


PROVINCIA 


C P 


J 























PROGRAMAS 



16,9:; "HAS PERDIDO " ; ap 
746 IF di<10 THEM 60 TO 3300 
750 FQR x*l TO 300: NEXT x: GQ 
SUB 3000 
755 SÜ TO 200 

770 PR INT INK O; AT 14,13;rí;AT 
16,12;"TU PUNTO" 

772 FOR x ™ 1 TO 200: NEXT x 
775 PRINT INK O;AT 9,O;"TU PUN 
TO" ; AT 11,3; re: LET t.p=re 
780 FOR x=l TO 100: NEXT x 
782 PRINT AT 14,13;" " ? AT 

16,12;" 

790 80 TO 247 


800 BEEP 0.5,20 


1 @TU 


{3. 



810 P R INT INK O 5 AT 14,1: . 

PUNTO!"s AT 16,10; "HAS BAÑADO 
p*2: LET di=di+ap*3 
815 IF di>100 AND di>rc THEM L 
ET rc-d i: LET ní»i$: PRINT AT i, 
19;" "5 PRINT INK 0;AT 1,1 

9; rrT? AT 1 ,27; r c : PR I NT I NK O; F 
LASH 1;AT 0,21?"RECORD" 

820 FQR x=l TO 300: NEXT x: 80 
SUB 3000’ 

825 Gü TQ 200 

840 PRINT INK OAT 14,3.3; r$ 

844 FQR x=l TO 200: NEXT x 
846 PRINT AT 14,13?" 

850 80 TO 247 

1000 REM CARAS DADO 1 

1001 PRINT PAPER 7? INK 0;AT xl 
,12;"AB";AT x1+1,12?"CD" 


101O 
1020 
1040 
1100 
, 12; 
1 110 
1120 
1140 
1200 
, 12? 
1210 
1220 
1240 
1300 
, 12 ; 
1310 
1320 
1340 
1400 
, 12? 
1410 
1420 
1440 
1500 
, 1.2; 
1510 
1520 
1540 
2000 
2001 
i 16; 
2010 
2020 


BEEP 0.01,1 
FÜR x — 1 TQ ti: 
RETURN 

PRINT PAPER 7; 
"E 11 ? AT x 1 + 1,12; 
BEEP 0.01,1 
FOR x=l TO ti: 
RETURN 

PRINT PAPER 7; 
"FB";AT x1+1,12? 
BEEP 0.01,1 
FOR x~l TO ti: 
RETURN 

PRINT PAPER 7; 
"EE"? AT x1 + 1,12; 
BEEP 0.01,1 
FOR x- = 1 TQ tía 
RETURN 

PRINT PAPER 7 i 
"FH"?AT x1+1,12? 
BEEP 0.01,1 
FQR x*=l TO ti: 
RETURN 

PRINT PAPER 7? 
11 JJ" ; AT x 1 + 1, 12 ; 
BEEP O .01 ,1 
FÜR x“ 1 TO ti: 
RETURN 

REM CARAS DADO 
PRINT PAPER 7? 
"AB";AT x 2+1,16; 
BEEP O.O1,1 
FOR x = 1 TO t2: 


NEXT x 
INK 0?AT xl 

«1 p ii 

NEXT x 

INK O;AT xl 
"CG" 

NEXT x 

INK O;AT xl 
1 * E Ei M 

NEXT x 

INK O;AT xl 
"IB" 

NEXT x 

INK O;AT xl 

n j,. 11 

NEXT x 


INK O;AT x 2 

fl II 


6 ¡ 


NEXT 
















PROGRAMAS 



2040 RETURN 

2100 PRINT PAPER 7; INK OqAT x2 
, 16;‘‘E AT x-2+1 , 16; E" 

2110 BEEP 0.01,1 

2120 FOR j<“í TO t2: NEKT 

2140 RETURN 

2200 PRINT PAPER 7:: INK O; AT x2 
,16; "F B " ; A l" x2+l, 16; "CCS" 

2210 BEEP 0.01,1 

2220 POR ;< = 1 TO t2: NEXT x 

2240 RETURN 

2300 PRINT PAPER 7; INK O;AT x2 
,16; "EE ’* :¡ AT x2+l ,16: "EE“ 

2310 BEEP 0.01,1 

2320 FOR x—1 TO t2ü NEXT x 

2340 RETURN 

2400 PRINT PAPER 7; INK O; AT x2 
, 16;"FH" ; AT x2+l,16; M 16" 

2410 BEEP 0.01,1 

2420 FOR x = l TO t2: NEXT x 

2440 RETURN 

25500 PRINT PAPER 7; INK O ; AT x2 
,16;"JJ";AT x2+l ,16;"KK " 

2510 BEEP Q.01,1 

2520 FOR x«l TO t2; NEXT x 

2540 RETURN 

3000 REM FIN DE JUEGO 

3001 PGKE 23658,8 

3003 PRI NT AT 9, O ;¡ " " ■ AT 

11,3;" "; AT 14,12; " 

" í: AT 16,9; " 

3005 PRINT #1 ; AT 1 ,0;"‘SIGUES JU 
GANDO?(S/N5 " 

- 30 1 0 IF INK EY-T="" QR (IN K EY %<>"S 
“ AND INKEYTC >"N") THEN GO TO 3 
010 

3020 IF INKEY4= ,, S" THEN RETURN 
3030 IF INKEY$="N" THEN PRINT # 
15 AT 1 , 0 ; "• J UEG A OTRO?( Q/ N > 

3035 PAUSE O 

3O 4 O IF INKE Y$=" " O R ( I NK E Y $ < > " S 
" AND INK EYT<>"N" ) TH E N GO TO 3 
040 

3045 IF INKEY$»"N" THEN GO TO 3 

ico 

3050 IF INKEYT=-" S " THEN PRINT # 
1;AT 1,0:" 'QU 1ERES I NSTRUCC IONES 
? < S / N) " 

3055 PAUSE O 

3060 IF INKÉY$*" " OR (INKEYTC >"S 


11 AND INKEYTC >"N" ) 
060 

THEN 

GÜ TO 


3065 IF INKEY$~"S" 
00 

THEN 

60 TO 

:l 

3070 IF 1NKEYT ==" N" 

45 

THEN 

GÜ TQ 

1 

3100 PÜKE 23606,0: 

PÜKE 

23607, 

60 

s BOEDER 7¡ PAPER 0 
30: PAPER 7; CLS : 

: CLS : PAUSE 
PRINT #0: 


1902 Sinclair Research Ltd.": PA 
USE O: BÜ TQ 9999 
3500 FOR x=*i TO 300: NEXT x 
3503 PRINT AT 9,0; " " ;AT 

11,3;" AT 14,12;" 

";AT 16,9;" » 

3505 PRINT #:L;AT 1,5; "NO TIENES 
DINERO PARA SEGUIR A 

POSTANDO" 

3510 FOR x= 1 TO 300: NEXT x 
3515 INPUT O 

3520 PRI NT # 1 AT 1 , O ; " ' JUEGA ÜTR 

O?(S/N)" 


3530 

00 TO 3035 


9000 

REM GRAFICOS 


9010 

FOR n 

i=U3R "a" TO USR "k"+7 

9020 

READ 

dato 


9030 

PGKE 

n,dato 


9040 

NEXT 

n 


9050 

DATA 

Q, 0,0, 0, 0,0,0 

,1 

9060 

DATA 

0,0,0,0,0,0,0 

, 1 28 

9070 

DATA 

1,0,0,0,0, 0 ,0 

,0 

9080 

DATA 

128,0,0,0,0,0 

,0,0 

9090 

DATA 

0,0,0,24,24,0 

, o, 0 

9100 

DATA 

0,0,0,24,24,0 

,0,1 

9110 

DATA 

128,0,0,24,24 

,0,0,0 

9120 

DATA 

0,0,0,24,24,0 

, 0,120 

9130 

DATA 

1 ,0,0,24,24,0 

, 0,0 

9140 

DATA 

0,0,0,24,24,0 

,0,24 

9150 

DATA 

24,0,0,24,24, 

0,0,0 

9160 

RETURN 


9990 

SAVE 

"CEAPS" LINE 

5: SAVE 


c hara 1 1 CODE 6 4250,760 

9991 CLS P RI NT "Programa graba 
do" 1 J " Reb ob i ríe la cinta y pu 1 se" 

' 11 una tec la p ar a ver i i i car " : PAU 
SE O 

9992 PR INI . Pulse PLAY": VER1FY 

"GRAPS": VERIFY "chars"BODE 642 

50 , 760 

9993 PRINT ""Correcto 11 










«Libro del RS-232» de Anaya Multi’ 
media en el que encontrarás todos 
los datos que te sean necesarios, 

Al ser el RS-232 una norma stan¬ 
dard, con el software adecuado po¬ 
drás conectar el Spectrum a cual¬ 
quier otro ordenador que disponga 
de salida RS-232, 


EN BUSCA DEL LISTADO 
PERDIDO 


En el número 20 de su revista, en el 
artículo «La guía del Hacker» falta el 
programa 2, Les agradecería que re¬ 
solviesen el problema publicando el 
listado de dicho programa. 


Dirige tus cartas a: 
Todospectrum 
Bravo Murillo. 377, 5 
28020 Madrid 


Angel J. Valiente 
Castellón 


De nuevo los duendes han hecho 
travesuras con nuestros listados. A 
continuación publicamos el listado 

ca, lo más probable es que se dete- P cr dido. 
riore alguno de los dos aparatos. 

3. El Wafadrive es un sistema de 
almacenamiento rápido de datos en 
cartuchos de cinta sin fin similar en 
funcionamiento al microdrive de 
Sinclair. 

4. El 128K es totalmente compati¬ 
ble con el Spectrum normal por lo 
que no debería haber ningún pro¬ 
blema en conectar las unidades de 

microdrive a su ordenador. . S( * un as . ld “ 0 lect0 '¡ de ™* stra rc * 

vista, especialmente del suplemento 

QL. Soy propietario de un QL ver¬ 
sión MGE y quisiera que me respon¬ 
dieseis a unas preguntas: 

1. ¿Existe algún libro en castellano 
sobre código máquina del 68008? 

2. ¿Cómo puedo conectar una im¬ 
presora Seikosha SP100 con salida 
Centronics? 


PROBLEMAS CON EL 128 


10 CLEAR 40000: LO A D“”CO D E 
POKE 65 440,81: POKE 65441,101: 
RANDOMJZE USR 65458 


Hace escasamente unos días que 
he adquirido un SPECTUM 128 y me 
gustaría que me aclaraseis algunas 
dudas que se me han planteado: 

1. Cuando conecto el interface de) 
joystick y el joystick me pasa del men¬ 
saje Copyright al modo mayúsculas, 
me aparecen unos ceros intermitente¬ 
mente. Cuando hago Reset me sucede 
lo mismo. ¿A qué es debido esto? 

2. ¿Es perjudicial para el ordena¬ 
dor quitarle el interface del joystick 
cuando está conectado a la red eléc¬ 
trica? 

3. ¿Que es un Wafadrive? 

4. ¿Se le pueden conectar al I28K, 
directamente las unidades de micro¬ 
drive? 


CODIGO MAQUINA 
DEL 68008 


APLICACIONES 
Y FUNCIONAMIENTO 
DEL RS-232 


Soy un asiduo lector de vuestra re¬ 
vista. Me dirüo a vosotros para pedi¬ 
ros información sobre el interface 
RS-232. Desearía conocer cuál es su 
funcionamiento y las posibilidades 
que existen de comunicarse con otro 
ordeandor que no sea Spectrum. 1- Existen varios libros sobre el 

68000 y 68008 en castellano. Entre 
ellos se encuentran: «Microproce¬ 
sadores de 16 bits», (edil. Paranin¬ 
fo), «68000 guía del usuario» y «QL 
Explicaren esta sección el funcio- guía avanzada del usuario» (edit. 
namíento del RS-232 resulta mate- RAMA), aunque este último trata 

rialmente imposible debido a la muy superficialmente el micropro- 

complejidad del tema. Sin embargo, cesador dedicándose en su mayoría 
podemos aconsejarte la lectura del a la descripción del QDOS. 


Jusé Vicente Cheto 
Castellón 


Miguel Angel Jiménez 
Madrid 


1. Si el ordenador le funciona co¬ 
rrectamente con el interface del 
joystick desconectado, indudable¬ 
mente su interface está defectuoso. 
Póngase en contacto con el vende¬ 
dor para que se lo repare o cambie 
por otro. 

2. Nunca se debe desconectar 
ningún tipo de periférico con el or¬ 
denador conectado a la red eléctri- 


Miguel Simo 
Palma de Mallorca 




2. Se encuentra en el mercado un 
adaptador serie-paralelo que permi¬ 
te conectar el QL con cualquier im¬ 
presora Centronics. 


SISTEMAS MIDI 
PARA SPECTRUM 

Ante todo deseo felicitaros por la 
magnífica revista que publicáis. Agra¬ 
decería que me facilitáseis direccio¬ 
nes de empresas qwue comercialicen 
sistemas MIDI para Spectrum o 
Commodore 64. 

Víctor Ordóñez 
Gijón 

Puedes ponerte en contacto con 
PIN-SOFT. Paseo de Gracia, 11. 
08007 Barcelona; o con Ventamatic. 
Córcega, 89. 08029 Barcelona. 


ENSEÑAR CASTELLANO 
A UN QL INGLES 

En un reciente viaje he adquirido 
un QL inglés; deseando adaptarlo al 
castellano, lo llevé al servicio técnico 
oficia l de Sinclair, pero al no disponer 
de la garantía oficial no me han adap¬ 
tado el ordenador. Quisiera saber si 
existe algún otro lugar donde pueda 
hacer dicha conversión. 

Javier Luis Puertas 
Madrid 

No conocemos ningún estableci¬ 
miento donde le puedan hacer di¬ 
cha adaptación. Sin embargo, pode¬ 
mos informarle de la existencia de 
una tarjeta convertidora que se co¬ 
necta directamente al bus de expan¬ 
sión. El único inconveniente es que 
no podrá conectar otro periférico 
(controlador de discos) simultánea¬ 
mente. Esta tarjeta la fabrica Abaco, 
pudiéndose adquirir en las tiendas 
especializadas por un precio aproxi¬ 
mado de 12.000 ptas. 


ARANA FOREVER 

Mi carta, como otras muchas que os 
han escrito, se centra sobre el Opera¬ 


tivo Arana (aprovecho para felicitar a 
Manuel por su programa). 

Mis conocimientos de Ensambla¬ 
dor son casi inexistentes, pero me 
gustaría modificar la rutina de impre¬ 
sión de pantalla para hacerlo en 51 
columnas. Mi intención no es conse¬ 
guir listados y mensajes de error de 
esta forma, sino simplemente la escri¬ 
tura en pantalla. ¿Qué modificacio¬ 
nes (si pueden hacerse) debo efec¬ 
tuar? Según creo, esta parte del pro¬ 
grama se publicó en el número de 
enero y empieza en la línea 1761 
(PROUT). 

Raúl Lión 

Valladolíd 

El conseguir que nuestro Spec¬ 
trum imprima a 51 columnas en lu¬ 
gar de sus 32 standard es más difícil 
aún que el convencerlo de que lo 
haga a 64. No es que sea imposible, 
pero pensamos que no vale la pena 
el esfuerzo, ya que las aplicaciones 
para las que puede servirnos son de¬ 
masiado específicas como para que 
resulte de interés general. 

Aprovechamos el momento para 
destacar que no es esta una sección 
de programas «a medida», sino un 
espacio deniro de TODOSPEC- 
TRUM en la que tienen cabida 
vuestras opiniones, preguntas y co¬ 
mentarios sobre todo tipo de temas. 
Viene esto a cuento porque, de un 
tiempo a esta parte, parece que estas 
lineas venían siendo utilizadas ex¬ 
clusivamente como un último re¬ 
curso a la hora de buscar el modo de 
resolver vuestros problemas de ca¬ 
rácter técnico. Y no es que no esté 
bien que nos comuniquéis vuestros 
problemas y dudas por si podemos 
seros útiles, pero empezamos a can¬ 
sarnos de que nos pongáis en un 
compromiso cuando, por ejemplo, 
nos pedís la forma de que funcione 
cierto programa comercial con un 
determinado tipo de impresora e ín- 
terface (de los que, a lo peor, no te¬ 
nemos suficiente información téc¬ 
nica) mientras los responsables de 
esta falta de información que a to¬ 
dos nos afecta (sean fabricantes, dis¬ 
tribuidores o vendedores) duermen 
tranquilos. 

Nos gustaría que esta sección fue¬ 
ra algo mucho más abierta y más hu¬ 
mana también; una vía de comuni¬ 


cación lectores-redacción por la que 
pasarán todas vuestras inquietudes 
y gracias a la que pudierais ver pu¬ 
blicada cualquier coda que os ape¬ 
tezca. Esperamos una verdadera llu¬ 
via de cartas en las próximas sema¬ 
nas. Mientras tanto, amigo Raúl, te 
recomendamos que sigas con asi¬ 
duidad ia serie de Lenguaje Máqui¬ 
na para que puedas resolver por ti 
mismo ese problema que tanto te 
preocupa. 


QL SUPERCHARGE, 

EL COMPILADOR 
FANTASMA 

Soy suscriptur de su revista TO- 
DOSPECTRUM, y estoy muy satis¬ 
fecho de ella, sobre todo la sección 
dedicada al ordenador QL. 

En el número de abril del 86 hubo 
un artículo dedicado al QL en que se 
mencionaba el compilador de Digital 
Precisión SUPERCHARGE. Como 
me interesa lo quise comprar y no me 
fue posible ya que no sabían que exis¬ 
tía. ¿Me pueden dar alguna dirección 
para adquirirlo? 


Luis de la Rosa 
Barcelona 

El programa al que hace men¬ 
ción fue adquirido en una de nues- 
Iras visitas al Reino Unido, y no sa¬ 
bemos con certeza si en estos mo¬ 
mentos alguna casa ha iniciado su 
distribución por nuestro país o si es¬ 
to llegará a hacerse algún día. Todo 
lo que podemos ofrecerte por el mo¬ 
mento son las señas del comercio 
donde lo adquirimos por si pudiera 
negociar su adquisición por correo. 
Estas son: 


SONIC FOTO CENTER 

256 TOTTENHAM COURT 

ROAD 

LONDON WIP9AD 
Teh; 01-580 5826/7 


¡Ojo!, el precio que tuvimos que 
pagar por el programa rozó las 100 
Libras esterlinas. 





Vendo Spectrum 48 K, cables, 
alimentador, manual (en español 
y en inglés), revistas, más de 40 
juegos, interface de joystick 
Kempston y el libro «Profundi¬ 
zando en el Spectrum». Todo en 
buen stado por 23.000 pías. Inte¬ 
resados escribir a Juan J. Sosa Lo¬ 
renzo. Pza. del Escorial, 4,5.°. Las 
Plamas de Gran Canaria. TeL: 
(928) 36 87 03. 


Vendo Spectrum 48 K con tecla¬ 
do multifunción 1, accesorios y 
documentación, junto con nume¬ 
rosos programas de juegos y útili- 
| dades, entre ellos lenguajes Logo 
castellano, Forth y Pascal de Hi- 
soft, por sólo 30.000 ptas. Llamar 
nochesalTel.:{91)31571 93. Pre¬ 
guntar por Tomás. 


Club para principiantes del 

Spectrum. Intercambios. Escribid 
a J. H. A. Federico García Lorca, 
21, 8.° B. Algeciras (Cádiz). 




Vendo ordenador Spectrum 48 
K, juegos, programas y manual, 
Interfáce 1, microdrive, Interface 
Indescomp serie y paralelo. Pre¬ 
cio 35.000 ptas, negociables. 
También los vendemos por sepa¬ 
rado, precio a convenir. Ana. 
TeL: (91) 437 49 03. 


Vendo Interface 1 , 2 unidades de 
microdrive, 20 cartuchos de mi¬ 
crodrive, libro de manejo y ma¬ 
nual de instrucción*. Todo en 
25.000 ptas. Joaquín Bayón Ló¬ 
pez. Capitán Almeida, 28, l.° B. 
TeL: (985) 22 61 13. 33009 Ovie¬ 
do. 


Vendo programas para Casio PB 
100, PB 110, PB 700, PB 770, FX 
750-P. Envío lista completa. Luis 
Alonso Pablo, júnior. José Ricart, 
44, At. 3. a . Sant Feiiu de Llobre- 
gat. 08980 Barcelona. TeL: (93) 
666 02 27. 






































LE OFRECE LOS MEJORES LIBROS 
PARA SU ORDENADOR 




P.V-P, ISO PTflS- 

(IVA INCLUIDO) 

Descubre los misterios de la 
programación de una forma 
sencilla, con ejemplos, 
programas y organigramas. 
(110 páginas, tamaño 13,5x21) 



P.V.P. 750 PTAS, 

(IVA INCLUIDO) 

Un libro especialmente 
dedicado a los que se inician 
por vez primera en el mundo 
del Spectmm. 

(100 páginas, tamaño 13,5x21). 


■P LOS MEJORES i 
■ PROGRAMAS 1 

I P.V.P. 900 PTAS. 

I OVA INCLUIDO) 

Un compendio de los 

IfljK H SSg. I p r c yr am a s n ¡ ás d: v e r s c j c ¡:«n 

I I los Q ue podrá aprender 

jugando las importantices 
t +türt. A JH características del BASIC 

P (258 páginas, tamaño 

__15,5x21,5). 





P.V.P, S0Ú PTAS- 

(IVA INCLUIDO) 

Con utilidades, juegos 
exploxivos y gráficos 
dinámicos que lleva al BASIC 
hasta el mejor 
aprovechamiento de sus 
posibilidades. 

(200 páginas, tamaño 

15,5 x 21,5). 


P.V.P. 800 PTAS, 

(IVA INCLUIDO) 

Una inestimable ayuda que 
complementará la que 
proporciona el manual del 
ordenador. 

(108 páginas tamaño 

13,5 x 21,5). 


P.V.P. 800 PTAS. 

(IVA INCLUIDO) 

Muestra una visión más 
completa del correcto 
funcionamiento del juego de 
instrucciones del C-64. 

(108 páginas, tamaño 

13,5 x 21,5). 


CUPON 
DE PEDIDO 

enviar a: 


rnm 


C/BRAVO MURILLO, 377 
28020 MADRID 


fuE: 


COPIE O RECORTE ESTE BOLETIN DE PEDIDO.t 

DESEO RECIBIR LOS SIGUIENTES TITULOS: 

15 HORAS CON EL SPECTRUM (P.V.P. 750) □ * 

LOS MEJORES PROGRAMAS PARA EL ZX SPECTRUM (P.V.P. 900) □ 

LOS MEJORES PROGRAMAS PARA EL COMMODORE 64 (P.V.P. 800) □ 

EL 64 MAS ALLA DEL MANUAL I (P.V.P. 800) □ 

EL 64 MAS ALLA DEL MANUAL II (P.V.P. 800) □ 

(más 100 ptas. de gastos de envío). 

El importe lo abonaré POR CHEQUE □ CONTRA REEMBQLSGD CQN MI TARJETA 
DE CREDITO □ American Express □ Visa □ Interbank □ 

rn 


| Número de mi tarjeta: ' | [ [ 

I 


lililí 


NOMBRE 

CALLE_ 

CIUDAD_ 

PROVINCIA 


C. P. 







































































1 s 


, 



_i áSk i 

■ 

■ ! 


k J 



La Guía Lotus Para Utilizar 





LA GUIA LOTUS PARA UTILIZAR SYMPHONY 

es un libro que le enseñará paso a paso, y de 
una forma muy práctica cómo utilizar este 
programa. 


CARACTERISTICAS: 

* Páginas: 443 

* Papel offset: 112 grs. 

* Tamaño: 182 x 232 mm. 

* Encuadernación: Rustica-cosido 


LA GUIA LOTUS contiene: 

— Cómo crear y manejar ficheros 

— Descripción detallada de las facilidades 
que ofrecen las ventanas de SYMPHONY. 

— Apéndice que cubre las aplicaciones adi¬ 
cionales que van incluidas en ei programa. 

— Un índice detallado y un vocabulario don¬ 
de fácilmente podrá encontrar cualquier 
tema que necesite. 


Ei complemento indispensable para el manual de SYMPHONY 


OFERTA DE LANZAMIENTO 4.500 PTAS. (IVA INCLUIDO) 


Recorte y envíe HOY MISMO este cupón a: ¡nfoúis.s.a. o/ Bravo Murillo, 377 - 28020 MADRID 

CUPON DE PEDIDO 



SI Envíenme el libro «LA GUIA LOTUS PARA UTILIZAR SYMPHONY» al 
precio de 4.500 PTAS. EL IMPORTE lo abonaré: 


TAMBIEN 
LO PUEDE 
ADQUIRIR 
EN SU LIBRERIA 
HABITUAL 


Con tarjeta de crédito VISA □ INTER8ANK □ AMERICAN EXPRESS □ 
CONTRAREEMBOLSO □ ADJUNTO CHEQUE □ 


Número de mi tarjeta